RosettaCodeData/Task/Pisano-period/Mathematica/pisano-period.math
2024-03-06 22:25:12 -08:00

29 lines
869 B
Text

ClearAll["Global`*"];
pisanos = <||>;
pisano[p_] := Module[{lastn, n, i}, If[p < 2, Return[1]];
i = pisanos[p];
If[i > 0, Return[i]];
lastn = 0; n = 1;
For[i = 1, i <= p^2, i++, {lastn, n} = {n, Mod[lastn + n, p]};
If[lastn == 0 && n == 1, pisanos[p] = i;
Return[i]]];
Return[1]]
pisanoprime[p_, k_] := Module[{}, Assert[PrimeQ[p]];
p^(k - 1)*pisano[p]]
pisanotask[n_] := Module[{factors}, factors = FactorInteger[n];
Map[pisanoprime[#[[1]], #[[2]]] &, factors] // Apply[LCM, #] &]
Do[If[PrimeQ[i],
Print["pisanoPrime[", i, ", 2] = ", pisanoprime[i, 2]]], {i, 1, 15}]
Do[If[PrimeQ[i],
Print["pisanoPrime[", i, ", 1] = ", pisanoprime[i, 1]]], {i, 1, 180}]
Print["\nPisano[n] for n from 2 to 180:"];
Print[Table[pisano[i], {i, 2, 180}]]
Print["\nPisano[n] using pisanoPrime for n from 2 to 180:"];
Print[Table[pisanotask[i], {i, 2, 180}]]