domenica 27 dicembre 2009

Algoritmo antiperiodo di una frazione

Dai blog precedenti abbiamo visto come lavorare sul periodo
di una frazione e come quest'ultimo dipendesse eslusivamente
dal denominatore della frazione.

Una frazione però può dare anche un antiperiodo. L'antiperiodo
è il numero di cifre dopo la virgola e che precedono quelle del
periodo.

Anche l'antiperiodo dipende esclusivamente dal denominatore
della frazione a/b. Per cui il numeratore può tranquillamente
essere a=1.

Alcuni esempi, con in rosso il periodo e in blu l'antiperiodo:

1/70 = 0.01428571428571428571428571429
1/130 = 0.007692307692307692307692307692
1/404 = 0.002475247524752475247524752475
1/808 = 0.001237623762376237623762376238

L'antiperiodo conta il numero di cifre antecedenti il periodo.

Da cosa dipende l'antiperiodo ed il periodo? E' lo stesso che chiedere:
"Da cosa dipende che un numero ha periodo finito, nullo o infinito?"

La periodicità, nulla, finita o infinita non è una proprietà
del numero (del denominatore della frazione) ma dipende da:
- base numerica che si considera (decimale, ottale, etc)
- numero di primi di cui è costituito il denominatore della frazione.


Ad esempio
1/10 = 0,1 è finito perchè 2, 5 e 10 sono contenuti in 10
1/3 = 0,33333 è irrazionale perchè 3 non è contenuto nella base 10

L'antiperiodo quindi è il massimo numero tra le potenze di 2^h e le potenze
di 5^k.

Quindi basta contare quante volte h è divisibile il numero per 2 e
quante volte k è divisibile il numero per 5 e si prende il massimo
tra i due valori h e k.

L'algoritmo quindi è molto semplice.

/*
*
* AntiPeriod of a fraction with
*
*/
AntPerN(n)= local(d2=0, d5=0); {

while( Mod(n,2) == 0, n = n/2; d2=d2+1);
while( Mod(n,5) == 0, n = n/5; d5=d5+1);

return(max(d2,d5));

}

Alla prox


0 commenti:

Posta un commento