Penso di aver fatto una scoperta interessante.
Nelle ultime due settimane ho messo alla prova le mie capacità di programmazione con problemi matematici sul mio sito personale johnrdorazio.altervista.org . Uno dei problemi che ho tradotto in codice PHP è stato il Triangolo di Pascal. Mi ha incuriosito scoprire che evidenziando i numeri dispari nel Triangolo di Pascal si crea un triangolo di Sierpiński. E ho cominciato a chiedermi: che cosa succederebbe se il Triangolo di Pascal fosse leggermente diverso? Quali altri tipi di risultati si possono ottenere evidenziando i numeri dispari?
Così ho pensato di provare qualcosa di molto semplice. Puoi vedere un esempio del Triangolo di Pascal qui:
http://johnrdorazio.altervista.org/SitoFlatnukePersonale/index.php?mod=problemsolving#pascal3angle
Si vede che il Triangolo di Pascal ha degli zeri invisibili all’esterno del triangolo che vengono sommati agli uni lungo il bordo esterno.
E mi sono chiesto: che cosa succederebbe se, invece di avere degli uni sul bordo esterno, avessimo degli incrementali (1,2,3,4…)? Il triangolo di Pascal ha degli incrementali, ma sulla seconda diagonale verso l’interno, in modo tale che le due diagonali con gli incrementali si incrociano in alto, producendo due uni proprio uno accanto all’altro.
E se invece le due diagonali non si incrociassero, ma partissero dallo stesso 1, diventando così i bordi esterni del triangolo? Otteniamo risultati leggermente diversi nell’addizione che viene eseguita.
Così ora provo a evidenziare i numeri dispari, e poi anche modulo 3, e faccio una scoperta interessante: le prime 33 righe sono un po’ come il triangolo di Sierpiński, con una sorta di motivo frattale, ma dalla riga 33 in poi otteniamo un’iperbole. Beh, non è fantastico? Che cosa significa? Non ne ho idea. Però mi è sembrato interessante…
————————————————
AGGIORNAMENTO:
Ok, nel frattempo ho capito un errore nel mio codice che causava questo comportamento di formazione di una “iperbole” quando si evidenziava modulo 2 (=numeri dispari) o modulo 3. Ha a che fare con il modo in cui PHP gestisce gli interi grandi. C’è un limite alla rappresentazione degli interi in PHP dovuto al numero di byte occupati da un intero grande. Ho letto che le macchine x64 possono rappresentare interi più grandi rispetto alle macchine x32, poiché hanno più “spazio in byte” per rappresentare gli interi. Una volta raggiunto quel limite, tutti gli interi più grandi verranno rappresentati come float anziché in notazione decimale. I numeri float non hanno la stessa precisione degli interi decimali, quindi questa rappresentazione inesatta, quando viene sottoposta a modulo, finisce per produrre non sempre più numeri dispari, ma sempre più numeri dall’”aspetto dispari” (!). La quantità di questi numeri dall’”aspetto dispari” cresce in modo piuttosto costante, il che dà alle celle evidenziate l’aspetto di un’iperbole.
Anche se si tratta di un “errore” nella matematica di PHP, che può essere corretto usando altre funzioni matematiche fornite da PHP, come bcmath, penso comunque che sia una cosa piuttosto carina. Suppongo che potrebbe essere interessante considerare la rappresentazione bitwise di questi interi grandi, che porta all’aspetto di iperbole (i numeri dispari di solito possono essere determinati esaminando le terminazioni dei bit nel valore binario dell’intero: una terminazione con bit 0 rappresenta un numero pari e una terminazione con bit 1 rappresenta un numero dispari; l’operatore bitwise di PHP “&” può essere usato a questo scopo). Forse si possono fare altri esperimenti con la rappresentazione binaria anziché con quella decimale, per vedere che cosa ne viene fuori.
Invece il modo corretto di scrivere il codice delle funzioni matematiche PHP (usando bcmath, che utilizza rappresentazioni come stringhe degli interi grandi in modo che non perdano la loro precisione, e in modo tale che non ci sia praticamente altro limite oltre alla memoria disponibile per il calcolo) ci dà un’evidenziazione dei numeri dispari un po’ diversa dal triangolo di Sierpiński, perché i triangoli evidenziati sembrano crescere quasi esponenzialmente…
