wsc810 发表于 2020-6-27 12:20:07

mathematica精度问题

本帖最后由 wsc810 于 2020-6-27 12:42 编辑

以下是计算分解$2^512+1$报错


IntegerPart::meprec: 当计算 IntegerPart[(98326482234939147319765934357793685660339022949204652705961168633314897265284+Sqrt)/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; d = 2^512 + 1; pell = -1;
P = 107450; Q = 523^2;
t = (P + Sqrt)/Q
a = IntegerPart];
i = 0; While[(t != 1/(t - a) && P != pell) || i == 1,
P = Q a - P;
Q = (d - P^2)/Q;
t = (P + Sqrt)/Q;
a = IntegerPart ];

p[-1] = 0; p = 1; p = a p + p;
q[-1] = 1; q = 0; q = a q + q;

If == Q || P == P ||
   FractionalPart]] == 0, Break[]];
Print[{i, Q, P, a}] i++];
{i, Q, P, a}
{i + 1, Q, P, a}
GCD p - P q + Sqrt Q], d]


mathematica 发表于 2020-6-27 13:27:26

看到我的签名了吗?
没注释的程序,没人愿意看的,放弃吧

mathematica 发表于 2020-6-27 13:28:26

要懂得换位思考,要想别人帮助你,就加上你的程序注释,
要学会站在别人的观点上看问题,
懂了吗?

dlpg070 发表于 2020-6-27 16:57:50

在代码前部增加
{$MaxExtraPrecision = 10000}
试一试

wsc810 发表于 2020-6-27 21:37:13

本帖最后由 wsc810 于 2020-6-27 21:42 编辑

dlpg070 发表于 2020-6-27 16:57
在代码前部增加
{$MaxExtraPrecision = 10000}
试一试

Clear; $MaxExtraPrecision = 1000;
d = 3*(2^512 + 1); pell = -1; P = 47654; Q = 521^2;
t = (P + Sqrt)/Q
a = IntegerPart];
i = 0; While[ i <= 1000 && (t != 1/(t - a) && P != pell) || i == 1,

剩下的代码和之前一样,这里用 i 控制最大迭代次数

谁能把上述代码改为动态形式,即不保留迭代过程中间的值

dlpg070 发表于 2020-6-28 10:07:16

wsc810 发表于 2020-6-27 21:37
剩下的代码和之前一样,这里用 i 控制最大迭代次数

谁能把上述代码改为动态形式,即不保留迭代 ...

查得因子分解结果
n = 2^512 + 1
n1 = 2424833
n2 = 7455602825647884208337395736200454918783366342657
n3 = 74164006262753080152478714190193747405994078109751902390582131614\
4415759504705008092818711693940737
n=n1*n2*n3
n1:7位, n2:49位, n3:99位 都是素数
已经验证

zeroieme 发表于 2020-7-4 13:23:08

wsc810 发表于 2020-6-27 21:37
剩下的代码和之前一样,这里用 i 控制最大迭代次数

谁能把上述代码改为动态形式,即不保留迭代 ...

把动态变量放在一起成为一个List,编写一个迭代函数实现\(List_i->List_{i+1}\),用NestWhile控制迭代终点。

wsc810 发表于 2020-7-26 07:33:16

本帖最后由 wsc810 于 2020-7-26 07:42 编辑

利用Round函数,将 Q,a 扩展为负数。计算$p_n,q_n$利用mod函数,减小对内存的占用

Clear;(*d=3*(2^512+1);pell=-1;P=223787;Q=521^2;*)

d = 997331; pell = -1; P = 0; Q = 1;

t = (P + Sqrt)/Q
a = Round];
i = 0; While[
i < 120000 && (t != 1/(t - a) && P != pell) || i == 1,
P = Q a - P;
Q = (d - P^2)/Q;
t = (P + Sqrt)/Q;
a = Round];

p[-1] = 0; p = 1; p = Mod p + p, d];
q[-1] = 1; q = 0; q = Mod q + q, d];

If == Q || P == P ||
   FractionalPart]] == 0, Break[]];

Print[{i, Q, P, a}] i++];
{i, Q, P, a}
{i + 1, Q, P, a}
GCD p - P q + (I)^(i + 1)*Sqrt Q],
d] // AbsoluteTiming

mathematica 发表于 2020-7-27 08:26:49

dlpg070 发表于 2020-6-28 10:07
查得因子分解结果
n = 2^512 + 1
n1 = 2424833


为什么要分解第9个费马数呢?直接网上查询不可以吗?
页: [1]
查看完整版本: mathematica精度问题