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只取奇数作为迭代因子。 Q对于 NestWhile来说是外部变量, NestWhile并不将迭代结果,包括中间结果和最终结果,对Q赋值。 hujunhua 发表于 2016-12-26 21:01
Q对于 NestWhile来说是外部变量, NestWhile并不将迭代结果,包括中间结果和最终结果,对Q赋值。
我赋值后也不起作用,代码怎么写,求教! Q=NestWhile[#/2&,Q, EvenQ]; NestWhile 的第一个参数是 纯函数,但你的Q不是 本帖最后由 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$ 你无非就是想利用连分数分解整数,
醒醒吧,省点劲,好好做好工作,
不要在数学上花费太多的力气! 本帖最后由 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$,使得以较小的距离达到最终的迭代结果 别人的msieve比mathematica强,
mathematica比郭先强还强,
郭都干不出来的事,你还是不要干了吧
国外有开源的分解质因数的软件,郭都搞不定,你就别想了,
首先大整数的乘法就很难,还有素数判定,
不仅要学一堆数学知识,还要学计算机编程,学汇编之类的,
我劝你放弃吧