La Prova del Nove

«La prova del nove» fa parte del nostro linguaggio parlato e scritto. In generale, indica una verifica che ci garantisce la veridicità o meno di un certo fatto. Ma quanti sanno da dove deriva questa locuzione?

In questo post intendo spiegare la prova del nove e dimostrarla con un semplice script PHP.

Il modulo

In aritmetica, esiste un’operazione chiamata modulo. Non è altro che il resto di una divisione fra due numeri interi. Ora, il modulo 9, cioè il resto della divisione per 9, ha una particolarità che lo rende facile da calcolare anche a mente, per numeri molto alti: equivale alla somma delle sue cifre. Se questa somma dà un risultato di più di una cifra, il procedimento va reiterato fino a ottenere un risultato di una cifra.

Naturalmente, se il risultato è 0 o 9, significa che la divisione non dà resto.

EDIT: in questa somma si può ignorare i 9, perché naturalmente non modificano il risultato. Ad esempio, la somma di 991 sarà 1.
Ringrazio Amedeo (vedi commenti) perché avevo dimenticato questo dettaglio. Nel suo commento vedrete anche come usare la prova del nove con le addizioni.

Esempio semplice:
52 (mod 9) = 7

Esempio reiterativo:
666 (mod 9) = 18 (mod 9) = 9 = 0

La prova

Possiamo sfruttare il modulo 9 per verificare il risultato di due operazioni. Infatti, se è vero che:
a * b = c
deve necessariamente essere vero che:
(a (mod 9) * b (mod 9)) (mod 9) = c (mod 9)
In parole: il mod9 del prodotto del mod9 dei fattori è uguale al mod9 del prodotto dei fattori.

Verifichiamo ad esempio che 55 * 6 = 330:
55 (mod 9) = 1
6 (mod 9) = 6
1 * 6 = 6
330 (mod 9) = 6

L’operazione è quindi corretta!

Ora verifichiamone una volutamente sbagliata: 4 * 40 = 170.
4 (mod 9) = 4
40 (mod 9) = 4
4 * 4 = 16
170 (mod 9) = 8

La prova del 9 ci conferma che l’operazione era errata!

Ma funziona davvero? (update)

Uno dei commenti afferma che la prova del Prova del Nove ha un 11% di probabilità di errore. Questa frase parrebbe riportata da Wikipedia, che afferma la stessa cosa. Non è del tutto falso, ma va spiegato.

Se io eseguo una moltiplicazione correttamente, la Prova del Nove me lo confermerà. Non è possibile che non risulti, state tranquilli. Il codice che vedrete nel prossimo paragrafo lo dimostra.

Naturalmente, non esiste un risultato che significa “hai sbagliato”. Se l’operazione è sbagliata, il risultato della Prova del Nove è semplicemente “imprevedibile”. Siccome il modulo 9 può risultare in un qualsiasi numero tra 0 e 8, e uno di loro è quello che mi aspetto, c’è 1 possibilità su 9 (11.1% periodico) che il risultato sia la cifra che mi aspetto. Il che potrebbe farmi credere che l’operazione sia giusta quando non lo è.

E’ probabile che questo succeda? No: 1 possibilità su 9 è scarsa. A questo bisogna aggiungere che, se eseguo la prova su un certo numero, è perché mi è risultato dalla moltiplicazione: questo aumenta le probabilità in nostro favore.

Implementazione in PHP

Siete bravi a fare i calcoli? Io no. E non era bravo neanche Einstein. Beh, a dire il vero pare che almeno nella teoria lui fosse un po’ più bravo di me, ma questi sono dettagli. Sta di fatto che vi sto scrivendo usando un computer, quindi perché non affidare a lui il compito ingrato di calcolare la prova del nove?

Scriviamo una piccola funzione PHP. Sull’implementazione non c’è molto da dire, se non che il modulo corrisponde all’operatore %.

Ho chiamato la funzione castNines perché prova del nove in inglese si dice casting out nines.

<?php
function castNines($f1, $f2)
{
  $mod1 = $f1 % 9;
  $mod2 = $f2 % 9;
  $p = $f1 * $f2;
  $mod3 = ($f1 * $f2) % 9;
  
  print '<p>';
  print (string)$f1 . ' * ' . (string)$f2 . '<br/>';
  print 'Result: ' . (string)($f1 * $f2) . '<br/>';
  print (string)$f1 . ' (mod 9) = ' . (string)$mod1 . '<br/>';
  print (string)$f2 . ' (mod 9) = ' . (string)$mod2 . '<br/>';
  print '(' . (string)$mod1 . ' * ' . (string)$mod2 . ') (mod 9) = '
    . (string)$mod3 . '<br/>';
  if ($mod3 === ($p % 9)) {
    print '<strong>OK!</strong>';
  } else {
    print 'Oooops! You found an exception to mathematical rules... or just a bug! :)';
  }
  print '</p>';
}
?>

Ora provatela pure con tutti i numeri che volete:

<?php
castNines(12, 10);
castNines(10, 1);
castNines(20, 3);
?>

A presto!

Annunci