wsc810 发表于 2016-12-25 20:51:51

mathematica因子分解

d = 4181; P = 0; Q = 1; pell = -1;
t = (P + Sqrt)/Q
a = IntegerPart [ t];
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];
NestWhile[ Q/2,Q, EvenQ];
If == Q || P == P, Break[]];
Print[{i, Q, P, a}]; i++]; {i, Q, P, a}

nestwhile在此程序中为何不起作用,程序的目的是让Q只取奇数作为迭代因子。

hujunhua 发表于 2016-12-26 21:01:26

Q对于 NestWhile来说是外部变量, NestWhile并不将迭代结果,包括中间结果和最终结果,对Q赋值。

wsc810 发表于 2016-12-26 21:06:12

hujunhua 发表于 2016-12-26 21:01
Q对于 NestWhile来说是外部变量, NestWhile并不将迭代结果,包括中间结果和最终结果,对Q赋值。

我赋值后也不起作用,代码怎么写,求教!

hujunhua 发表于 2016-12-26 21:25:52

Q=NestWhile[#/2&,Q, EvenQ];

wayne 发表于 2016-12-28 10:22:42

NestWhile 的第一个参数是 纯函数,但你的Q不是

wsc810 发表于 2017-1-6 20:53:44

本帖最后由 wsc810 于 2017-1-6 20:55 编辑

d = 13717421; pell = -1; P = 18; Q = 31;
t = (P + Sqrt)/Q
a = IntegerPart [ t];
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];
If == Q || P == P, Break[]];
Print[{i, Q, P, a}]; i++]; {i, Q, P, a}


d为要分解的数,选取适当的Q,使得JacobiSymbol=1,并求出PowerMod的值作为P,然后迭代即可
所有的$Q_n,Q_{n-1},P_n$,满足$Q_nQ_{n-1}+P_n^2=d$

mathematica 发表于 2017-1-7 00:44:23

你无非就是想利用连分数分解整数,
醒醒吧,省点劲,好好做好工作,
不要在数学上花费太多的力气!

wsc810 发表于 2017-1-10 13:18:05

本帖最后由 wsc810 于 2017-1-10 13:27 编辑

另外一种分解的方法是令要分解的奇合数$n$等于$Q_nQ_{n-1}$,选取的参数为$P_n$,即程序当中的pell,要求的条件为$P_n$为偶数,且$P_n>|frac{Q_n-Q_{n-1}}{2}|$,计算$d=n+P_n^2$,若$\sqrt{d}$的类只有一种结构,则在它的连分数展开中是可以裂解的。
举例
d = 4181 + 66^2; pell = 66; P = 0; Q = 1;
这里需要改进的地方为怎样合理选取$Q_0$,使得以较小的距离达到最终的迭代结果

mathematica 发表于 2017-5-16 18:56:17

别人的msieve比mathematica强,
mathematica比郭先强还强,
郭都干不出来的事,你还是不要干了吧

mathematica 发表于 2017-5-16 19:00:44

国外有开源的分解质因数的软件,郭都搞不定,你就别想了,
首先大整数的乘法就很难,还有素数判定,
不仅要学一堆数学知识,还要学计算机编程,学汇编之类的,
我劝你放弃吧
页: [1] 2 3
查看完整版本: mathematica因子分解