找回密码
 欢迎注册
查看: 21997|回复: 47

[讨论] 被连续自然数取模后全为质数的最小整数

[复制链接]
发表于 2020-8-4 15:02:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
求一个大于2的最小整数,其被$3,4,5,6,7,..., n-1, n$ 除后余数都是质数。

经过代码验证:

n=4,最小整数是 11,
n=5~10,最小整数是 23,
n=11~12,最小整数是 47,
n=13~24,最小整数是 887,
n=25~28,最小整数是 39107,
n=29~30,最小整数是 503627,
n=31~34,最小整数是1021907,
n=35~36,最小整数是 11088227,
n=37~40,最小整数是 12649367,
n=41~43,最小整数是 103424807,
n=44,最小整数是 2860681127,
n=45~48,最小整数是 3383683607,
n=49~50,最小整数是 8261017607
n=51~52,最小整数是 188008585607
n=53~56,  最小整数是 1395515070407
n=57~58,  最小整数是 2345173940567
n=59~60,  最小整数是 3018245755367
n=61~62,  最小整数是 7985415341207

11#
63       1479414399394932002
64~66 2690526997513555202
67~70  6173829500412974402
71~72 40167003465777988802
73       68441507929450656002
74~78 195797066175538027202
79~81  616072054588129339202
82       11689927965263544796802
83~85 200413348268577717873602
86~88 1300882803083249632646402
89~93 2471436184401308960035202
94~96 425002077871009060888065602
97       562356157505626272053865602
98~100 1673620390251025045311081602
101~102 2034287189655174142001913602
103~105 6497642650272411454440624002
106~108 293794470445062408741351432002

12#
109~112 63316341740975305645497774139202
113~117 315317221876783126525319154360002
118~121 359391980206726313623343310744002
122~124 173044793183066045276433017693673602
125~126 393565946202528402313011298817520002
127~130 4437387269491025869779373423874064002
131~133 26628491970767443062229473376178352002
134~138 259613540181287584989772406543516304002

21#
139~141 4188696294935413706934768125377042512002
142~150 71375535419096138855747944430720887776002
151~156 28466105341303483745606123156025578668368002
157         81849859751405924059843476855289279826496002
158~162 746294017377509464097706103446488143037568002
163~165 33635406647457932883180477167488271261164992002
166         154918018148228242519886464835636651505317472002
167~168 299084197184085790849033982186295000595719696002
169~172 3531371825353917671492584999407565716875889792002

23#
173~177 116810701936766586361368933161051719437728630688002
178         353943738186338730051340043852386052151622936272002
179~180 7459558178581420991908368303782280420035186413104002
181~190 26079504486542128214527139484976208504732884352208002
191~192 114397711072547200623926739913773332504663121492864002
193~196 7333244963252694316979523001920058246398799258689312002
197~198 16754955673880622369079802324257242816195831706070400002
199~205 1241815872795527340920909004524886711949273374627222000002
206~210 72225715647186222395152227158525640349057726424522471280002
211~213 85659367391722784092607464197468049651961443566063782640002
214~217 31673053784774069114917859005213870009008990233082429871008002
218~222 663127145086112525715369034835863236326107289562909156940992002
223~225 2036184500294580388401873354629853515994924364902165172748112002
226~232 185768755747358998327069097333443876936859437235420585132525904002
233~241 4828299556190106737188708726420164405880642740182586600077808144002
242~250 1439011990188211741334841754244394476887612560371605459101394720656002
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 13:50:25 | 显示全部楼层
几年前想过类似问题
可能只有搜索一条路
因为如果,我们稍微一般化一些,把问题改成,这里有若干重复0-1序列
0 1 0 0 1 0……(循环周期为3)
0 1 0 0 0 1 0 0……(循环周期为4)
0 1 0 0 0 0 1 0 0 0……(循环周期为5)
0 1 0 0 1 0 0 1 0 0 1 0……(循环周期为6)
0 1 0 0 1 0 0 0 1 0 0 1 0 0……(循环周期为7)
0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0……(循环周期为8)
……
问这些循环序列什么时候同时取1
这个问题是你的问题的推广(只要把循环序列的起点改改位置,忽略掉前两位0 1,就是你的问题的等价问题)
而如果没记错,RSA可以化归成这个推广
我曾经讨论过这个推广问题,但好像没有答案
https://bbs.emath.ac.cn/thread-15495-1-1.html

让我想想当初我是怎么化归的好了
没记错是转去二次剩余

对n=pq,计算s^2%n, 得到r
从而r同时是p和q的二次剩余
根据二次互反律,我们可以r,推得p和q是某些小素数的二次剩余/二次非剩余(忘记这里怎么化简了)
然后把小素数的二次剩余列成循环0-1序列,借助上面提到的算法,就能进行计算了

大概如此
当然不排除几年前脑子抽筋忘记s^2%n很大的这个事实

点评

有可能是当初脑子抽筋的缘故。因为我也忘记如何处理s^2%n了。  发表于 2020-8-5 17:47
跳跃比较大,没跟上,^_^  发表于 2020-8-5 16:34
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 19:46:16 | 显示全部楼层
找出一些特别约束
2(Mod 3)
3(Mod 4)
5(Mod 6)
11(Mod 12)
2(Mod 15)
17(Mod 30)
2(Mod 45)
47(Mod 60)
47(Mod 90)
47(Mod 120)
2(Mod 135)
3(Mod 140)
17(Mod 150)
2(Mod 165)
47(Mod 180)
17(Mod 210)
2(Mod 225)
11(Mod 228)
167(Mod 240)
137(Mod 270)
3(Mod 280)
167(Mod 300)
2(Mod 315)
59(Mod 336)
47(Mod 360)
167(Mod 390)
2(Mod 405)
11(Mod 456)
167(Mod 480)
2(Mod 495)
47(Mod 510)
17(Mod 570)
2(Mod 585)
47(Mod 588)
167(Mod 600)
2(Mod 675)
11(Mod 684)
17(Mod 690)
3(Mod 700)
167(Mod 780)
11(Mod 816)
2(Mod 855)
17(Mod 870)
3(Mod 910)
11(Mod 912)
17(Mod 930)
2(Mod 945)
647(Mod 960)
3(Mod 980)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 20:01:44 | 显示全部楼层
前面我认为最小结果不可能是偶数,因为如果是,那么必然会导致这个结果超级大,但是发现去除偶数条件后,得出上面的列表中
11(Mod 12)
2(Mod 15)
3(Mod 140)
会存在矛盾,也就是140以后,只能为偶数并且模所有范围内偶数为2

点评

没事了,n=63最小的数字是1479414399394932002,明显比7985415341207长一大截(……)  发表于 2020-8-6 00:01
看一下n=63,我n=63只搜到了2,而mod 2572970400的余数只可能是2 367567202 1470268802,原因未知,但很可能是你发现的n=132的情形。  发表于 2020-8-5 23:50
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 20:13:40 | 显示全部楼层
现在去除结果必须是偶数的额外要求,那么关于各个n,1000以内余数唯一的有:
2(Mod 3)
2(Mod 15)
2(Mod 45)
2(Mod 132) #说明n在132以后,结果只能取偶数, 而且除以任意不超过132(但是大于2)的偶数的余数都是2.
2(Mod 135)
2(Mod 165)
2(Mod 225)
2(Mod 264)
2(Mod 315)
2(Mod 330)
2(Mod 396)
2(Mod 405)
2(Mod 420)
2(Mod 450)
2(Mod 495)
2(Mod 528)
2(Mod 540)
2(Mod 585)
2(Mod 630)
2(Mod 660)
2(Mod 672)
2(Mod 675)
2(Mod 720)
2(Mod 792)
2(Mod 810)
2(Mod 840)
2(Mod 855)
2(Mod 900)
2(Mod 924)
2(Mod 945)
2(Mod 990)
余数只有两个的有
[2, 3](Mod 4)
[2, 3](Mod 5)
[2, 5](Mod 6)
[2, 5](Mod 9)
[2, 11](Mod 12)
[2, 17](Mod 30)
[2, 47](Mod 60)
[2, 17](Mod 75)
[2, 47](Mod 90)
[2, 17](Mod 105)
[2, 47](Mod 120)
[2, 3](Mod 140)
[2, 17](Mod 150)
[2, 47](Mod 180)
[2, 167](Mod 195)
[2, 17](Mod 210)
[2, 11](Mod 228)
[2, 167](Mod 240)
[2, 47](Mod 255)
[2, 137](Mod 270)
[2, 3](Mod 280)
[2, 17](Mod 285)
[2, 167](Mod 300)
[2, 59](Mod 336)
[2, 17](Mod 345)
[2, 47](Mod 360)
[2, 167](Mod 390)
[2, 17](Mod 435)
[2, 11](Mod 456)
[2, 17](Mod 465)
[2, 167](Mod 480)
[2, 47](Mod 510)
[2, 17](Mod 525)
[2, 5](Mod 561)
[2, 17](Mod 570)
[2, 47](Mod 588)
[2, 167](Mod 600)
[2, 17](Mod 615)
[2, 5](Mod 627)
[2, 11](Mod 684)
[2, 17](Mod 690)
[2, 5](Mod 693)
[2, 3](Mod 700)
[2, 17](Mod 735)
[2, 47](Mod 765)
[2, 167](Mod 780)
[2, 11](Mod 816)
[2, 5](Mod 819)
[2, 167](Mod 825)
[2, 17](Mod 870)
[2, 3](Mod 910)
[2, 11](Mod 912)
[2, 17](Mod 930)
[2, 647](Mod 960)
[2, 167](Mod 975)
[2, 3](Mod 980)
余数只有三个的有
[2, 3, 5](Mod 7)
[2, 3, 7](Mod 8)
[2, 3, 7](Mod 10)
[2, 3, 5](Mod 14)
[2, 5, 11](Mod 18)
[2, 3, 7](Mod 20)
[2, 5, 17](Mod 21)
[2, 11, 23](Mod 24)
[2, 3, 19](Mod 28)
[2, 5, 29](Mod 33)
[2, 11, 23](Mod 36)
[2, 5, 17](Mod 42)
[2, 3, 7](Mod 44)
[2, 11, 23](Mod 48)
[2, 5, 29](Mod 66)
[2, 3, 17](Mod 70)
[2, 47, 59](Mod 84)
[2, 5, 29](Mod 99)
[2, 3, 7](Mod 176)
[2, 5, 29](Mod 198)
[2, 11, 47](Mod 204)
[2, 5, 227](Mod 231)
[2, 5, 89](Mod 273)
[2, 17, 317](Mod 375)
[2, 11, 47](Mod 408)
[2, 5, 29](Mod 429)
[2, 3, 37](Mod 455)
[2, 5, 227](Mod 462)
[2, 3, 7](Mod 520)
[2, 3, 271](Mod 532)
[2, 5, 89](Mod 546)
[2, 17, 467](Mod 555)
[2, 3, 283](Mod 560)
[2, 3, 7](Mod 572)
[2, 11, 23](Mod 576)
[2, 11, 107](Mod 624)
[2, 17, 557](Mod 645)
[2, 3, 17](Mod 665)
[2, 3, 7](Mod 704)
[2, 3, 7](Mod 715)
[2, 17, 317](Mod 750)
[2, 5, 71](Mod 759)
[2, 3, 17](Mod 805)
[2, 3, 7](Mod 836)
[2, 5, 29](Mod 858)
[2, 3, 7](Mod 880)
[2, 17, 47](Mod 915)
[2, 5, 71](Mod 957)

而对于小于132的情况,我们可以先仅搜索奇数的结果,这时结果只有一种的有
3 (Mod 4)
5 (Mod 6)
11 (Mod 12)
2 (Mod 15)
17 (Mod 30)
2 (Mod 45)
47 (Mod 60)
47 (Mod 90)
47 (Mod 120)
两种的有
[2, 3] (Mod 5)
[3, 7] (Mod 8)
[2, 5] (Mod 9)
[3, 7] (Mod 10)
[3, 5] (Mod 14)
[5, 11] (Mod 18)
[3, 7] (Mod 20)
[11, 23] (Mod 24)
[3, 19] (Mod 28)
[11, 23] (Mod 36)
[5, 17] (Mod 42)
[3, 7] (Mod 44)
[11, 23] (Mod 48)
[5, 29] (Mod 66)
[3, 17] (Mod 70)
[2, 17] (Mod 75)
[47, 59] (Mod 84)
[2, 17] (Mod 105)
三种的有:
[2, 3, 5] (Mod 7)
[3, 7, 11] (Mod 16)
[2, 5, 17] (Mod 21)
[2, 5, 29] (Mod 33)
[3, 7, 23] (Mod 40)
[5, 11, 29] (Mod 78)
[3, 7, 47] (Mod 88)
[11, 23, 71] (Mod 96)
[2, 5, 29] (Mod 99)
[5, 47, 59] (Mod 126)
[3, 7, 37] (Mod 130)

点评

看到了,mod7200的时候果然只剩下2了。如果限定在50,mod7200好像余数只能是[2, 407, 2567, 4007, 6167]  发表于 2020-8-5 23:05
刷新得慢了点……请忽略前面那条点评……现在我推得n>=50时mod900的余数只能是[2, 317, 407, 767, 857],不知你那里是怎么推得余数只能为2的,是默认n>1000吗?  发表于 2020-8-5 22:59
n=52时最小的n,188008585607,mod75的确是32而非[2,17]  发表于 2020-8-5 22:57
n=52我们只能挑选Mod后面不超过52的数据,其中结果只有一种的合并后为47(Mod 180), 188008585607是满足的  发表于 2020-8-5 21:58
但我发现n=52,188008585607%75=32,难道还有更小的数字吗?  发表于 2020-8-5 21:54
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 22:54:52 | 显示全部楼层
本帖最后由 .·.·. 于 2020-8-5 23:31 编辑

在mathe的启发下……我发现
这个预搜索指令真心好用:
  1. LENGTH=7200;
  2. b=Vec(0,LENGTH);
  3. for(i=1,LENGTH,b=i)
  4. fordiv(LENGTH,t,if(t>2 && t<=50,c=[];for(i=1,length(b),if(!isprime(b%t),c=setunion(c,[b])));b=setminus(b,c)))
  5. b
复制代码
换成Rust代码(因为setunion步在LENGTH很大时候太耗时,而我不知道如何操作gp的Vec)
  1. fn search_pre(){
  2.     let mut b:Vec<_>=(1..=LENGTH).collect();
  3.     for t in 3..=UPPER{
  4.         if LENGTH%t==0{
  5.             for i in (0..b.len()).rev(){
  6.                 if !ISPRIME[b%t]{b.swap_remove(i);}
  7.             }
  8.         }
  9.     }
  10.     b.sort_unstable();
  11.     println!("{} {:?}",LENGTH,b);
  12. }
复制代码
得到
  1. 1058400 [2, 54407, 79607, 99767, 124967, 151202, 205607, 230807, 276167, 302402, 326567, 382007, 432407, 477767, 502967, 583607, 608807, 628967, 654167, 705602, 734807, 760007, 805367, 855767, 856802, 911207, 961607, 1006967, 1008002, 1032167]
复制代码
这样我们可以很方便地进行搜索了
等我结果~

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-5 23:44:31 | 显示全部楼层
本帖最后由 .·.·. 于 2020-8-6 02:06 编辑
.·.·. 发表于 2020-8-5 22:54
在mathe的启发下……我发现
这个预搜索指令真心好用:
换成Rust代码(因为setunion步在LENGTH很大时候太 ...

23:39:56> for(i=3,65,if(!isprime(3018245755367%i),print(i)))
61
63
64
23:40:08> for(i=3,65,if(!isprime(3881604836567%i),print(i)))
61
63
65
23:40:22> for(i=3,65,if(!isprime(7985415341207%i),print(i)))
63
65
23:40:31> for(i=3,65,if(!isprime(8349851234567%i),print(i)))
63

用60测得的4个结果,最小的3018245755367会在61失效,而直到n=62,7985415341207仍然可用

算这个……
  1. real        0m2.583s
  2. user        0m24.142s
  3. sys        0m0.076s
复制代码

Rust是个好程序
预计算是个好算法
  1. #![feature(const_int_pow)]
  2. const ISPRIME:[bool;201]=[false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false];
  3. const UPPER:usize=60;
  4. extern crate rayon;
  5. use rayon::prelude::*;
  6. fn main(){
  7.     let b=search_pre();
  8.     search_after(&b);
  9. }
  10. const LENGTH:usize=2usize.pow(5)*3usize.pow(3)*5usize.pow(2)*7usize.pow(2);
  11. fn search_pre()->Vec<usize>{
  12.     let mut b:Vec<_>=(1..=LENGTH).collect();
  13.     for t in 3..=UPPER{
  14.         if LENGTH%t==0{
  15.             for i in (0..b.len()).rev(){
  16.                 if !ISPRIME[b[i]%t]{b.swap_remove(i);}
  17.             }
  18.         }
  19.     }
  20.     b.sort_unstable();
  21.     b
  22. }
  23. fn search_after(b:&[usize]){
  24.     (0..8000000usize).into_par_iter().for_each(|x|{
  25.         for i in b.into_iter().map(|c|c+x*LENGTH){
  26.             if (3..=UPPER).all(|t|ISPRIME[i%t]){
  27.                 println!("found n={}!",i)
  28.             }
  29.         }
  30.     })
  31. }
复制代码

下面可以放心地从搜索63开始了
Update:63的结果:
found n=2!
found n=5117373107443396802!
found n=5469140162292206402!
found n=4561419428803036802!
found n=12698992845016077602!
found n=15055225617580948802!
found n=3364025168209305602!
found n=1479414399394932002!
62的时候最小值是7985415341207
63的时候最小值是1479414399394932002
害怕……
PS.n>=63时,数字mod1010824870255200的结果只能是2,288807105787202,577614211574402
这里1010824870255200是CRT算出来的
把Rust改成u128之后算得
  1. 00:45:21> for(i=3,90,if(!isprime(195797066175538027202%i),print(i);break))
  2. 79
  3. 00:45:38> for(i=3,90,if(!isprime(616072054588129339202%i),print(i);break))
  4. 81
复制代码
Rust主程序如下
  1. #![feature(const_int_pow)]
  2. const ISPRIME:[bool;201]=[false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false];
  3. const UPPER:usize=74;
  4. const LENGTH:u128=if UPPER>=63 {1010824870255200} else{2usize.pow(5)*3usize.pow(3)*5usize.pow(2)*7usize.pow(2)} as u128;
  5. extern crate rayon;
  6. use rayon::prelude::*;
  7. fn main(){
  8.     let b=if UPPER<63{
  9.         search_pre()
  10.     }else{
  11.         search_pre_ge63()
  12.     };
  13.     search_after(&b);
  14. }
  15. fn search_pre()->Vec<u128>{
  16.     dbg!(LENGTH);
  17.     let mut b:Vec<_>=(1..=LENGTH).collect();
  18.     for t in 3..=UPPER as u128{
  19.         if LENGTH%t==0{
  20.             for i in (0..b.len()).rev(){
  21.                 if !ISPRIME[(b[i]%t) as usize]{b.swap_remove(i);}
  22.             }
  23.         }
  24.     }
  25.     b.sort_unstable();
  26.     dbg!(b)
  27. }
  28. fn search_pre_ge63()->Vec<u128>{
  29.     assert!(LENGTH==1010824870255200);
  30.     vec![2,288807105787202,577614211574402]
  31. }
  32. fn search_after(b:&[u128]){
  33.     (0..3193600u128).into_par_iter().for_each(|x|{
  34.         for i in b.into_iter().map(|c|c+x*LENGTH){
  35.             if (3..=UPPER).all(|t|ISPRIME[(i%t as u128) as usize]){
  36.                 println!("found n={}!",i)
  37.             }
  38.         }
  39.     })
  40. }
复制代码

Update,如果我的搜索没错(多半有BUG……)
n=63时,每rep=591133442051411133755680800个数中有294053760个数符合题意
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-6 02:55:05 | 显示全部楼层
本帖最后由 .·.·. 于 2020-8-6 03:33 编辑

果然,内存就是正义~

              总计         已用        空闲      共享    缓冲/缓存    可用
内存:        62Gi        20Gi        29Gi       511Mi        12Gi        41Gi
交换:          0B          0B          0B

  1.     Finished release [optimized] target(s) in 1.06s
  2.      Running `target/release/rayonops`
  3. i=37,len=33,rep=37400520199442400
  4. i=41,len=396,rep=1533421328177138400
  5. i=43,len=5148,rep=65937117111616951200
  6. i=47,len=72072,rep=3099044504245996706400
  7. i=53,len=1081080,rep=164249358725037825439200
  8. i=59,len=17297280,rep=9690712164777231700912800
  9. i=61,len=294053760,rep=591133442051411133755680800
  10. found n=3364025168209305602!
  11. found n=3364025168209305602!
  12. found n=3364025168209305602!
  13. found n=51028461100223006402!
  14. found n=51028461100223006402!
  15. found n=51028461100223006402!
  16. found n=51028461100223006402!
  17. found n=68441507929450656002!
  18. found n=68441507929450656002!
  19. found n=68441507929450656002!
  20. found n=195797066175538027202!
  21. found n=195797066175538027202!
  22. found n=195797066175538027202!
  23. found n=195797066175538027202!
  24. found n=195797066175538027202!
  25. found n=616072054588129339202!
  26. found n=616072054588129339202!
  27. found n=8410148118619471224002!
  28. found n=200413348268577717873602!
  29. found n=200413348268577717873602!
  30. found n=200413348268577717873602!
  31. found n=200413348268577717873602!
  32. found n=2471436184401308960035202!
  33. found n=2471436184401308960035202!
  34. found n=2471436184401308960035202!
  35. found n=2471436184401308960035202!
  36. found n=2471436184401308960035202!
  37. found n=2471436184401308960035202!
  38. found n=2471436184401308960035202!
  39. found n=2471436184401308960035202!

  40. real        8m40.586s
  41. user        8m32.632s
  42. sys        0m6.895s
复制代码

用的n=63做初次筛选,n=63的第一个循环周期中,最好结果是n=93:2471436184401308960035202

调整参数从94开始搜索,至106
程序
  1. #![feature(const_int_pow)]
  2. const ISPRIME:[bool;201]=[false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false];
  3. fn main(){
  4.     let mut x=(vec![2],442720643463713815200);
  5.     for i in 48..=70{
  6.         x=search_roll(x.0,i,x.1);
  7.         println!("i={},len={},rep={}",i,(x.0).len(),x.1)
  8.     }
  9.     (x.0).sort_unstable();
  10.     search_once(&x.0);
  11. }
  12. #[inline]
  13. fn gcd(mut i:u128,mut j:u128)->u128{//ensure i<j for better performance
  14.     while i != 0{
  15.         let t=j%i;
  16.         j=i;
  17.         i=t;
  18.     }
  19.     j
  20. }
  21. fn search_roll(b:Vec<u128>,ix:u128,mut repeats:u128)->(Vec<u128>,u128){
  22.     let i=ix/gcd(ix,repeats);
  23.     let mut b=if i>1{b.into_iter().map(|x|(0..i).map(|c|c*repeats+x).collect::<Vec<_>>()).flatten().collect::<Vec<_>>()}else{b};
  24.     repeats*=i;
  25.     for i in (0..b.len()).rev(){
  26.         if !ISPRIME[(b[i]%ix) as usize]{b.swap_remove(i);}
  27.     }
  28.     (b,repeats)
  29. }
  30. fn search_once(b:&[u128]){
  31.     let mut upper=94;
  32.     let mut c=b.into_iter();
  33.     c.next();
  34.     for i in c{
  35.         while (94..=upper).all(|t|ISPRIME[(i%t as u128) as usize]){
  36.             upper+=1;
  37.             println!("found n={}!",i)
  38.         }
  39.     }
  40. }
复制代码
结果

  1. $ time cargo run --release
  2.    Compiling rayonops v0.1.0 (/me/rust/rayonops)
  3.     Finished release [optimized] target(s) in 0.40s
  4.      Running `target/release/rayonops`
  5. i=48,len=1,rep=442720643463713815200
  6. i=49,len=3,rep=3099044504245996706400
  7. i=50,len=3,rep=3099044504245996706400
  8. i=51,len=3,rep=3099044504245996706400
  9. i=52,len=3,rep=3099044504245996706400
  10. i=53,len=45,rep=164249358725037825439200
  11. i=54,len=45,rep=164249358725037825439200
  12. i=55,len=45,rep=164249358725037825439200
  13. i=56,len=45,rep=164249358725037825439200
  14. i=57,len=45,rep=164249358725037825439200
  15. i=58,len=45,rep=164249358725037825439200
  16. i=59,len=720,rep=9690712164777231700912800
  17. i=60,len=720,rep=9690712164777231700912800
  18. i=61,len=12240,rep=591133442051411133755680800
  19. i=62,len=12240,rep=591133442051411133755680800
  20. i=63,len=12240,rep=591133442051411133755680800
  21. i=64,len=12240,rep=1182266884102822267511361600
  22. i=65,len=12240,rep=1182266884102822267511361600
  23. i=66,len=12240,rep=1182266884102822267511361600
  24. i=67,len=220320,rep=79211881234889091923261227200
  25. i=68,len=220320,rep=79211881234889091923261227200
  26. i=69,len=220320,rep=79211881234889091923261227200
  27. i=70,len=220320,rep=79211881234889091923261227200
  28. found n=347092984475551631116802!
  29. found n=347092984475551631116802!
  30. found n=347092984475551631116802!
  31. found n=347092984475551631116802!
  32. found n=347092984475551631116802!
  33. found n=347092984475551631116802!
  34. found n=347092984475551631116802!
  35. found n=3656872515010276113552002!
  36. found n=3656872515010276113552002!
  37. found n=3656872515010276113552002!
  38. found n=3656872515010276113552002!
  39. found n=3656872515010276113552002!
  40. found n=438874286513301069573542402!
  41. found n=2945647999374828361426612802!
  42. found n=2945647999374828361426612802!
  43. found n=15928574310436718235442737602!
  44. found n=15928574310436718235442737602!
  45. found n=15928574310436718235442737602!
  46. found n=15928574310436718235442737602!

  47. real    0m1.012s
  48. user    0m1.390s
  49. sys    0m0.077s
复制代码
  1. $ time cargo run --release
  2.    Compiling rayonops v0.1.0 (/me/rust/rayonops)
  3.     Finished release [optimized] target(s) in 0.42s
  4.      Running `target/release/rayonops`
  5. [src/main.rs:6] (2..HALF).fold(1, |s, x| s * (x / gcd(s, x))) = 164249358725037825439200
  6. i=54,len=1,rep=164249358725037825439200
  7. i=55,len=1,rep=164249358725037825439200
  8. i=56,len=1,rep=164249358725037825439200
  9. i=57,len=1,rep=164249358725037825439200
  10. i=58,len=1,rep=164249358725037825439200
  11. i=59,len=16,rep=9690712164777231700912800
  12. i=60,len=16,rep=9690712164777231700912800
  13. i=61,len=272,rep=591133442051411133755680800
  14. i=62,len=272,rep=591133442051411133755680800
  15. i=63,len=272,rep=591133442051411133755680800
  16. i=64,len=272,rep=1182266884102822267511361600
  17. i=65,len=272,rep=1182266884102822267511361600
  18. i=66,len=272,rep=1182266884102822267511361600
  19. i=67,len=4896,rep=79211881234889091923261227200
  20. i=68,len=4896,rep=79211881234889091923261227200
  21. i=69,len=4896,rep=79211881234889091923261227200
  22. i=70,len=4896,rep=79211881234889091923261227200
  23. i=71,len=93024,rep=5624043567677125526551547131200
  24. i=72,len=93024,rep=5624043567677125526551547131200
  25. i=73,len=1860480,rep=410555180440430163438262940577600
  26. found number=7428738981146675284850822064002 for n=107!
  27. found number=7428738981146675284850822064002 for n=108!
  28. found number=63316341740975305645497774139202 for n=109!
  29. found number=63316341740975305645497774139202 for n=110!
  30. found number=63316341740975305645497774139202 for n=111!
  31. found number=63316341740975305645497774139202 for n=112!
  32. found number=315317221876783126525319154360002 for n=113!
  33. found number=315317221876783126525319154360002 for n=114!
  34. found number=315317221876783126525319154360002 for n=115!
  35. found number=315317221876783126525319154360002 for n=116!
  36. found number=315317221876783126525319154360002 for n=117!
  37. found number=359391980206726313623343310744002 for n=118!
  38. found number=359391980206726313623343310744002 for n=119!
  39. found number=359391980206726313623343310744002 for n=120!
  40. found number=359391980206726313623343310744002 for n=121!

  41. real        0m14.928s
  42. user        0m15.362s
  43. sys        0m0.093s
  44. $ time cargo run --release
  45.    Compiling rayonops v0.1.0 (/me/rust/rayonops)
  46.     Finished release [optimized] target(s) in 0.42s
  47.      Running `target/release/rayonops`
  48. [src/main.rs:6] (2..HALF).fold(1, |s, x| s * (x / gcd(s, x))) = 591133442051411133755680800
  49. i=62,len=1,rep=591133442051411133755680800
  50. i=63,len=1,rep=591133442051411133755680800
  51. i=64,len=1,rep=1182266884102822267511361600
  52. i=65,len=1,rep=1182266884102822267511361600
  53. i=66,len=1,rep=1182266884102822267511361600
  54. i=67,len=18,rep=79211881234889091923261227200
  55. i=68,len=18,rep=79211881234889091923261227200
  56. i=69,len=18,rep=79211881234889091923261227200
  57. i=70,len=18,rep=79211881234889091923261227200
  58. i=71,len=342,rep=5624043567677125526551547131200
  59. i=72,len=342,rep=5624043567677125526551547131200
  60. i=73,len=6840,rep=410555180440430163438262940577600
  61. i=74,len=6840,rep=410555180440430163438262940577600
  62. i=75,len=6840,rep=410555180440430163438262940577600
  63. i=76,len=6840,rep=410555180440430163438262940577600
  64. i=77,len=6840,rep=410555180440430163438262940577600
  65. i=78,len=6840,rep=410555180440430163438262940577600
  66. i=79,len=143640,rep=32433859254793982911622772305630400
  67. i=80,len=143640,rep=32433859254793982911622772305630400
  68. i=81,len=287280,rep=97301577764381948734868316916891200
  69. i=82,len=287280,rep=97301577764381948734868316916891200
  70. i=83,len=6320160,rep=8076030954443701744994070304101969600
  71. found number=173044793183066045276433017693673602 for n=122!
  72. found number=173044793183066045276433017693673602 for n=123!
  73. found number=173044793183066045276433017693673602 for n=124!
  74. found number=393565946202528402313011298817520002 for n=125!
  75. found number=393565946202528402313011298817520002 for n=126!
  76. found number=4437387269491025869779373423874064002 for n=127!
  77. found number=4437387269491025869779373423874064002 for n=128!
  78. found number=4437387269491025869779373423874064002 for n=129!
  79. found number=4437387269491025869779373423874064002 for n=130!

  80. real    1m11.578s
  81. user    1m11.703s
  82. sys    0m0.164s
复制代码
算131的时候u128溢出了,而Rust没有u256供我使用
就这样吧

评分

参与人数 1威望 +12 金币 +12 贡献 +12 经验 +12 鲜花 +12 收起 理由
wayne + 12 + 12 + 12 + 12 + 12 rust都用上了,厉害厉害

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-6 06:09:10 来自手机 | 显示全部楼层
n=63就提前进入偶数了?非常意外。进入偶数范围后会要求对所有范围内偶数余数为2,这个条件非常厉害,会一下子大大缩小范围
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-8-6 12:57:29 | 显示全部楼层
的确,通过寻找166320的因子作为标准,如果仅查看奇数情况,那么得出
在n=62时,模166320只留下余数69527和124967
而继续添加n=63时,模166320已经没有任何余数留下了,这说明n=63以后的结果必然是偶数。
于是结果模62以下所有偶数都是2,由此得出结果Mod(2, 144403552893600)
于是n=63的结果必然形如144403552893600*k+2,而且关于32到63之间任意一个素数或素数的幂的余数都是素数
于是可以搜索到k=10245时,结果1479414399394932002满足
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-8 19:28 , Processed in 0.094314 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表