Predrag Terzic on Tue, 14 May 2019 20:28:02 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Conversion (MATHEMATICA to PARI/GP) |
Can anyone help me to convert this Mathematica code (see attachment) to PARI/GP code?
Mathematica code :
polmul[f_, g_, r_, n_] := Mod[f.NestList[RotateRight, g, r - 1], n]
matmul[a_, b_, r_, n_] :=
Mod[{{polmul[a[[1, 1]], b[[1, 1]], r, n] +
polmul[a[[1, 2]], b[[2, 1]], r, n],
polmul[a[[1, 1]], b[[1, 2]], r, n] +
polmul[a[[1, 2]], b[[2, 2]], r, n]}, {polmul[a[[2, 1]],
b[[1, 1]], r, n] + polmul[a[[2, 2]], b[[2, 1]], r, n],
polmul[a[[2, 1]], b[[1, 2]], r, n] +
polmul[a[[2, 2]], b[[2, 2]], r, n]}}, n]
matsq[a_, r_, n_] := matmul[a, a, r, n]
matpow[a_, k_, r_, n_] :=
If[k == 1, a,
If[EvenQ[k], matpow[matsq[a, r, n], k/2, r, n],
matmul[a, matpow[matsq[a, r, n], (k - 1)/2, r, n], r, n]]]
xmat[r_, n_] := {{PadRight[{0, 2}, r],
PadRight[{n - 1}, r]}, {PadRight[{1}, r], ConstantArray[0, r]}}
smallestr[n_] := Module[{r}, If[n == 1 \[Or] EvenQ[n], Return[0]];
For[r = 3, MemberQ[{0, 1, r - 1}, Mod[n, r]], r = NextPrime[r + 1],
If[r < n \[And] Mod[n, r] == 0, Return[0]]];
r]
isprime[n_] :=
With[{r = smallestr[n]},
If[r == 0, n == 2,
With[{xp = matpow[xmat[r, n], n - 1, r, n]},
Mod[RotateRight[xp[[1, 1]]] + xp[[1, 2]], n] ===
PadRight[Append[ConstantArray[0, Mod[n, r]], 1], r]]]]
|
Attachment:
Cheby.nb
Description: Cheby.nb