- 注册时间
- 2021-11-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 9178
- 在线时间
- 小时
|
发表于 2022-9-20 13:39:35
|
显示全部楼层
总结一下:
先找witness(这个witness最好也满足费马测试),也就是能证明卡米歇尔数是合数的miller rabin的测试基,
对于素数,永远满足x^2=1(mod p),所以只有±1的平凡解,所以从liar的嘴里得不到因子,只能去witness去找因子。
多找几个witness基,然后不断开平方找因子。
- (*分解卡米歇尔大合数*)
- Clear["Global`*"];
- n=1267342751027148335067248740406802390769;(*找到一个卡米歇尔数,等待分解的卡米歇尔数,合数*)
- nold=n;(*备份一下*)
- (*miller rabin test,n0 big odd integer,a0 base*)
- MillerRabin[n0_,a0_]:=Module[{n=n0,a=a0,s,m,t1,k},
- s=0;m=n-1;While[Mod[m,2]==0,m=m/2;s=s+1];
- t1=PowerMod[a,m,n];
- If[t1==1,Return[True]];
- k=0;While[k<s-1&&t1!=n-1,k=k+1;t1=Mod[t1^2,n]];
- If[t1==n-1,Return[True],Return[False]]
- ](*miller rabin子函数*)
- (*子函数,指数不断除以2,看能否得到因子.参数:基底;待分解的大整数;同余式的模;大整数里面有几个2*)
- GetFactor[a_,nold_,n_,kmax_]:=Module[{x,k},(*m不指定为局部变量,m全局变量*)
- Do[x=PowerMod[a,(nold-1)/2^k,n];
- If[(x!=1)&&(x!=n-1)&&Mod[x^2-1,n]==0,m={GCD[x-1,n],GCD[x+1,n],k};Print[m]],
- {k,1,kmax}](*nold-1最多4个2,所以k的最大值是4*)
- ]
- (*找出n的miller rabin的witness(没通过MR测试的底能提供因子),因为需要这些数来分解,因此多找几个备用*)
- Select[Range[2,10],Not@MillerRabin[n,#]&](*输出{2, 3, 4, 5, 6, 7, 8, 9, 10}*)
- a=2;(*上面生成的结果,选择2为基*)
- GetFactor[a,nold,n,4]
- PrimeQ[m](*素性判定,看哪个是素因子*)
- p1=m[[2]];(*第一次找到的因子*)
- n=nold/p1;(*将n除以上面找到素因子,这样模就变小了*)
- a=3;(*计算表明2这个基再也给不出因子,因此换成基3*)
- GetFactor[a,nold,n,4]
- PrimeQ[m](*素性判定,看哪个是素因子*)
复制代码
|
|