- 注册时间
- 2009-4-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 3513
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
本帖最后由 wsc810 于 2020-6-27 12:42 编辑
以下是计算分解 $2^512+1$ 报错
IntegerPart::meprec: 当计算 IntegerPart[(98326482234939147319765934357793685660339022949204652705961168633314897265284+Sqrt[13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084097])/21411857147225534274333691936648159351360900761484521674541875264122802693051] 时,达到内部精确度极限值 MaxExtraPrecision = 50
用向下取整函数 Floor[ ] 还是一样
$P_0=\sqrt{d} (mod Q_0^2)$
分解整数所用的原理是用到如下pell 方程公式,迭代过程中$Q_i$为完全平方数终止迭代
$(Q_0^2p_i-P_0q_i)^2-dq_i^2=(-1)^{i+1}Q_0^2Q_i$
- Clear[t, a, d, P, Q, i, p, q]; d = 2^512 + 1; pell = -1;
- P[0] = 107450; Q[0] = 523^2;
- t[0] = (P[0] + Sqrt[d])/Q[0]
- a[0] = IntegerPart[t[0]];
- i = 0; While[(t[i] != 1/(t[0] - a[0]) && P[i] != pell) || i == 1,
- P[i + 1] = Q[i] a[i] - P[i];
- Q[i + 1] = (d - P[i + 1]^2)/Q[i];
- t[i + 1] = (P[i + 1] + Sqrt[d])/Q[i + 1];
- a[i + 1] = IntegerPart [t[i + 1]];
- p[-1] = 0; p[0] = 1; p[i + 1] = a[i] p[i] + p[i - 1];
- q[-1] = 1; q[0] = 0; q[i + 1] = a[i] q[i] + q[i - 1];
-
- If[Q[i + 1] == Q[i] || P[i + 1] == P[i] ||
- FractionalPart[Sqrt[Q[i + 1]]] == 0, Break[]];
- Print[{i, Q[i], P[i], a[i]}] i++];
- {i, Q[i], P[i], a[i]}
- {i + 1, Q[i + 1], P[i + 1], a[i + 1]}
- GCD[Q[0] p[i + 1] - P[0] q[i + 1] + Sqrt[Q[i + 1] Q[0]], d]
复制代码
|
|