Bogomult

El revolucionari nou algorisme de multiplicació

Implementació de l'algorisme

En Rust

fn bogomult(x: u64, y: u64) -> u64 { if x == 0 { return 0 } if x == 1 { return y } let mut n = 0; while n < bogomult(x - 1, y) + y { n += 1 } n }

En C++

uint64_t bogomult(uint64_t x, uint64_t y) { if (x == 0) return 0; if (x == 1) return y; uint64_t n = 0; while (n < bogomult(x - 1, y) + y) n += 1; return n; }

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ó

  1. Es crida a \( bogomult(5, 2) \), iniciant el seu descens a l'infern.
  2. \( bogomult(5, 2) \) crida a \( bogomult(4, 2) \)
  3. \( bogomult(4, 2) \) crida a \( bogomult(3, 2) \)
  4. \( bogomult(3, 2) \) crida a \( bogomult(2, 2) \)
  5. \( bogomult(2, 2) \) crida a \( bogomult(1, 2) \)
  6. \( bogomult(1, 2) \) retorna 2, perque \( x = 1 \)
  7. \( 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 \).
  8. \( bogomult(3, 2) \) fa el mateix fins arribar a \( bogomult(2, 2) + 2 = 4 + 2 = 6 \), i retorna \( 6 \).
  9. \( bogomult(4, 2) \) fa el mateix fins arribar a \( bogomult(3, 2) + 2 = 6 + 2 = 8 \), i retorna \( 8 \).
  10. \( bogomult(5, 2) \) fa el mateix fins arribar a \( bogomult(4, 2) + 2 = 8 + 2 = 10\) i retorna \( 10 \).
  11. Descobrim que \(5\cdot 2 = 10\)