找回密码
 欢迎注册
楼主: mathematica

[求助] 同余方程x^2=a(mod p)如何求解

[复制链接]
 楼主| 发表于 2019-3-13 16:32:19 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-3-14 10:44:53 | 显示全部楼层
你不是推崇穷举法么?
直接列出模的平方剩余表,从中找呗。计算量也不大,至少是多项式时间的。

点评

牵涉到大数运算,通常时间复杂度表示为$\log(p)$的多项式我们才说是多项式时间,穷举是不达标的。  发表于 2019-3-14 11:54
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-3-14 11:54:15 | 显示全部楼层
hujunhua 发表于 2019-3-14 10:44
你不是推崇穷举法么?
直接列出模的平方剩余表,从中找呗。计算量也不大,至少是多项式时间的。

大前提:穷举法有效的时候推荐穷举法!
穷举法没效果,还推荐啥?
给你一个一百位的大素数,你怎么计算这个二次同余方程的解?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-3-15 12:48:48 | 显示全部楼层
mathematica 发表于 2019-3-13 15:13
看算法数论,这本书没提到求原根!
  1. Clear["Global`*"];(*Clear all variables*)
  2. (*算法数论,有限域的开平方算法,附录*)
  3. FiniteSqrt[a_,p_]:=Module[{beta,s,t,e,h,b},
  4.     If[JacobiSymbol[a,p]==-1,Return[False]];
  5.     (*找到非剩余*)
  6.     beta=2;While[JacobiSymbol[beta,p]!=-1,beta=beta+1];
  7.     (*p-1=2^s*t*)
  8.     s=0;t=p-1;While[Mod[p,2]==0,s=s+1;p=p/2];
  9.     e=0;
  10.     Do[h=Mod[a*PowerMod[beta,-e,p],p];
  11.         (*个人觉得这个IF下面应该增加break*)
  12.         If[PowerMod[h,2^(s-i-1)*t,p]!=1,e=e+2^i;Break[]],
  13.         {i,1,s-1,1}
  14.     ];
  15.     h=Mod[a*PowerMod[beta,-e,p],p];
  16.     b=Mod[PowerMod[beta,e/2,p]*PowerMod[h,(t+1)/2,p],p];
  17.     Return[b]
  18. ]

  19. FiniteSqrt[2,97]
  20. FiniteSqrt[3,13]
  21. FiniteSqrt[5,29]
复制代码


按照这个,我写了一个程序!

点评

还有一个解52607  发表于 2019-3-16 12:48
FiniteSqrt[13, 65537]返回12930,至于结果为什么对,不知道  发表于 2019-3-15 12:50
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-20 12:00 , Processed in 0.042261 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表