给出几个自定义的数论Package
终于考完Mathematica,趁有时间发个BLOG先。一直自学着潘承洞的 《初等数论》 \
,里面关于原根、指标的计算实在繁杂,所以编了几个Packages在做题时用,希望对学习数论的朋友有用。(已经假定你具备已有的知识)
先介绍几个Mathematica的本身的命令:
EulerPhi[n] // 欧拉函数
MultiplicativeOrder[k, n, 1] //求mod n ,k的指数
PrimitiveRoot[n] // 求n最小正原根
PrimePowerQ[n] // 判别n是否素数的方幂
MultiplicativeOrder[k, n, r] // (字符编辑原因,不能识别Latex格式,自己在软件上查吧)
具体的用法我就不详细多说,从Mathematica中的帮助文档能得到更多信息。
下面我给出几个自定义的Package
1)PrimitiveQ[m];判别一个正整数m是否具有原根,有的返回True,没有的返回False
BeginPackage["PrimitiveQ`"]
PrimitiveQ::usage = "PrimitiveQ[m_]:判断正整数m是否存在原根,存在返回True,否则返回False"
Begin["`Private`"]
PrimitiveQ[m_] := Module[{n}, If[m == 1 || m == 2 || m == 4,
Return[True], If[Mod[m, 4] == 0, Return[False],
If[PrimePowerQ[m] == True, Return[True],
n = m/2; If[PrimePowerQ[n] == True, Return[True],
Return[False]]]]]; ];
End[]
EndPackage[]
2)Ind[m,a];当m存在原根时,以m的最小正原根为底a的指标;m=2^a(a>=3)时,以-1,5为底a的指标
BeginPackage["Ind`"]
Ind::usage = "(a,m)=1,当m存在原根时,\!\(\*SubscriptBox[\(以模m的最小正原根g为底a的指标\[Gamma]\)\
, \(m, g\)]\)(a);当m=\!\(\*SuperscriptBox[\(2\), \
\(\[Alpha]\)]\)(\[Alpha]>=3)时,以-1,5\!\(\*SubscriptBox[\(为底a的指标\[Gamma]\), \(\(-1\), \
5\)]\)(a);其余情况,返回False"
Begin["`Private`"]
<< "Fwind`PrimitiveQ`"
Indm[m_, a_] := Module[{q, g, \[CurlyPhi]}, g = PrimitiveRoot[m];
If[a == g, Return[1], \[CurlyPhi] = EulerPhi[m];
q = MultiplicativeOrder[g, m, a]; Return[q]; ]; ];
Indt[m_, a_] := Module[{l, o, \[Gamma], y, h},
If[Mod[m, 2] == 0 && PrimePowerQ[m], y = Mod[(a - 1)/2, 2];
h = MultiplicativeOrder[5, m, a*(-1)^y]; \[Gamma] = Mod[h, m/4];
Return[{y, \[Gamma]}], Return[False]]; ];
Ind[m_, a_] := Module[{c = {}, k}, If[GCD[a, m] != 1, Return[False]];
If[PrimitiveQ[m] == True, k = Indm[m, a]; Return[k],
c = Indt[m, a]; Return[c]]; ];
End[]
EndPackage[]
3)TableDeta[m] 求模m的指数表
BeginPackage["TableDeta`"]
TableDeta::usage = "求模m的指数表"
Begin["`Private`"]
TableDeta[m_] := Module[{a, u = {}, v = {}},
For[a = 2, a < m, a++, If[GCD[m, a] == 1, AppendTo[u, a];
AppendTo[v, MultiplicativeOrder[a, m]]]]; Return[{u, v}]];
End[]
EndPackage[]
4)TableInd[m] 求模m的指标表
BeginPackage["TableInd`"]
TableInd::usage = "求模m的指标表,原根存在时,以最小正原根为底,返回指标表;m=\!\(\*SuperscriptBox\
[\(2\), \(\[Alpha]\)]\)(\[Alpha]>=3)时,以-1,5为底,返回指标表;其他情况返回False"
Begin["`Private`"]
<< "Fwind`Ind`"
TableInd[m_] := Module[{a, g, u = {}, v = {}},
For[a = 1, a < m, a++,If[GCD[a, m] == 1, AppendTo[u, a];
AppendTo[v, Ind[m, a]]]; ]; Return[{u, v}]];
End[]
EndPackage[]
以上的代码直接复制到M程序上就可以使用~~~~~~
关于最后两个的求表的函数可以用//MatrixForm 来得到比较美观的形式
欢迎大家指导~~~~~~~~~
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL待 续LLLLLLLLLLLLLLLLLLLLLLLLLLLLL