给出几个自定义的数论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

转载于:https://www.cnblogs.com/Leonhard-E/archive/2012/06/18/2553968.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值