数学研发论坛

 找回密码
 欢迎注册
查看: 137|回复: 1

[原创] 基于连分式的因子分解程序,改进型

[复制链接]
发表于 2019-7-2 20:55:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
此种分解方法要求迭代初值$ Q $为平方数 ,终止值  $Q_{i+1}$ 也为平方数,$Q[0]=1$为特殊情况。

$Q[0]=Q^2,P[0]=Sqrt[d,1/2,Q^2]$

依据的数学公式

$(Q^2*p_i^2-P*q_i^2)^2-d*q_i^2=(-1)^{i+1}Q^2*Q_{i+1}$

取模运算

$(Q^2*p_i^2-P*q_i^2)^2=(Q*Sqrt[Q_{i+1}])^2   (mod  d )$

算法过程为连分式展开

${P+\sqrt{d}}/Q^2$

若未能找到 $ d $ 的一个因子,替换初值 $P$ 为 $-P$ 或者为  $Q^2-P$

程序设定了最大迭代次数  $k$  ,防止$d$过大而陷入长时间的运算

  1. Clear[t, a, P, p, q, Q]; d = 455839; P[0] = 8; Q[0] = 25;
  2. t[0] = (P[0] + Sqrt[d])/Q[0]
  3. a[0] = IntegerPart[t[0]];
  4. p[0] = 1; p[-1] = 0; q[0] = 0; q[-1] = 1;
  5. k = 100000;
  6. i = 0; While[ i <= k ||  i == 1,
  7. P[i + 1] = Q[i] a[i] - P[i];
  8. Q[i + 1] = (d - P[i + 1]^2)/Q[i];
  9. t[i + 1] = (P[i + 1] + Sqrt[d])/Q[i + 1];
  10. a[i + 1] = IntegerPart[t[i + 1]];
  11. p[i + 1] = Mod[a[i] p[i] + p[i - 1], d];
  12. q[i + 1] = Mod[a[i] q[i] + q[i - 1], d];

  13. If[Q[i + 1] == Q[i] || P[i + 1] == P[i] ||

  14.    IntegerQ[Sqrt[Q[i + 1]]] == True && EvenQ[i + 1] == True, Break[]];

  15. i++]

  16. {i, Q[i], P[i], a[i], p[i], q[i]}

  17. {i + 1, Q[i + 1], P[i + 1], a[i + 1], p[i + 1], q[i + 1]}

  18. GCD[Sqrt[Q[0]*Q[i + 1]] + Q[0] p[i + 1] - P[0] q[i + 1], d]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-7-3 18:36:15 | 显示全部楼层
谁能将以上方法改为动态函数,就是迭代过程中不需要保留数组的值,这样能提高效率。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2019-7-18 16:43 , Processed in 0.049076 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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