Bogomult
El revolucionari nou algorisme de multiplicació
Implementació de l'algorisme
En Rust
En C++
Explicació de l'algorisme
Bogomult és un excel·lent algorisme que rep dos nombres naturals \((x,y)\) i retorna el seu producte \(xy\) aplicant la estructura recursiva bàsica:
Cas base
Si \( x = 0 \), la funció retorna 0: qualsevol \(y\) multiplicada per 0 és 0.
Si \( x = 1 \), la funció retorna \(y\): qualsevol \(y\) multiplicada per 1 és \(y\).
Cas recursiu
La clau d'aquest algorisme és el fet que \(xy = (x-1)y + y\). Aprofitant aquest fet, podem reduir quelsevol parella d'enters a un dels casos base anteriors.
Seguint la hipòtesi d'inducció, sabem que podem calcular \((x-1)y\), i com \(xy = (x-1)y + y\), ho utilitzem com a substituit.
Fixem-nos ara en el natural \(n\): mentre \(n \lt xy \), l'anem incrementant. Quan arribi a ser exactament \(xy\) sabrem, per definició, que és el resultat desitjat.
Finalment, quan ja sabem que \(n = xy\), només cal retornar \(n\).
Exemple d'execució
- Es crida a \( bogomult(5, 2) \), iniciant el seu descens a l'infern.
- \( bogomult(5, 2) \) crida a \( bogomult(4, 2) \)
- \( bogomult(4, 2) \) crida a \( bogomult(3, 2) \)
- \( bogomult(3, 2) \) crida a \( bogomult(2, 2) \)
- \( bogomult(2, 2) \) crida a \( bogomult(1, 2) \)
- \( bogomult(1, 2) \) retorna 2, perque \( x = 1 \)
- \( bogomult(2, 2) \) inicia un bucle que incrementa \( n \) des de 0 fins arribar a \( bogomult(1, 2) + 2 = 2 + 2 = 4 \), i retorna \( 4 \).
- \( bogomult(3, 2) \) fa el mateix fins arribar a \( bogomult(2, 2) + 2 = 4 + 2 = 6 \), i retorna \( 6 \).
- \( bogomult(4, 2) \) fa el mateix fins arribar a \( bogomult(3, 2) + 2 = 6 + 2 = 8 \), i retorna \( 8 \).
- \( bogomult(5, 2) \) fa el mateix fins arribar a \( bogomult(4, 2) + 2 = 8 + 2 = 10\) i retorna \( 10 \).
- Descobrim que \(5\cdot 2 = 10\)