找回密码
 欢迎注册
楼主: 毒酒滴冻鸭

[转载] 233猜想

[复制链接]
 楼主| 发表于 2026-1-8 19:25:05 | 显示全部楼层
感谢各位高手大神们的参与回复讨论。。。

正如9楼wayne兄说的,这个猜想结果的有趣性在于不但迭代过程必然收敛没有发散,而且最后必然归宿于一个固定26个正整数的循环数集,而不会进入其他正整数组成的另一循环数集。。。

现在看看感觉有点像【罗马道路】的建设结构:

相传在古罗马帝国最兴盛时期,集合全国人力物力构建出一个以罗马都城为中心的道路系统,从都城向四面八方建出先进方便的道路,并声称【从欧洲大陆任意一处地方出发,只要沿着道路走最终必能通向罗马城】。。。此也是谚语【路路通罗马】或【条条大路通罗马】的出处。。。

而这个26正整数循环数集就像一个有26个城门的罗马都城,从城外四面八方的所有起点(其他大于1的正整数),按一楼说的迭代规则(沿着道路走)终将进入这个循环(抵达罗马城)。。。

那么感觉可以进行这样的编程:与其用【233】或【177】之类的固定数值作检测目标,不如用整个26数数集,并记录从任何起点在哪个位置(城门)进入循环,这样就可以统计例如从2到1亿,这26个进入点哪个的使用次数最高(即【流通率最频密的城门】)。。。另外也可统计从各个起点进入循环(抵达城门)的步数,从而统计出各点【与罗马城的距离】,并看看哪些数值【距离罗马城最远】。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-8 21:18:26 | 显示全部楼层
这个比较稳定,根据入口的频率从高到低是这个顺序
  1. {477,411,233,533,177,599,2333,8211,3133,1377,2411,6011,9077,6611,9533,8577,5999,9977,23333,24111,95333,60111,136199,66799,194577,233333}
复制代码


如果以477作为结束的入口. 长度可以是75

  1. {16463267215777913441495522695794515723979492274402326422003030724250333,164632672157779134414955226957945157239794922744023264220030307242503333,7962236525314762022509896493975236777,7646438610693135525314411306996299,82186618488363397878073033,2786402836326499,2143386797174233,1307501248811,537380811,43399,433999,100933,144199,131099,42299,422999,32299,322999,3229999,50399,4999,49999,499999,1277,12777,42599,10399,103999,1799,2577,8599,85999,859999,175511,250733,433,4333,6199,61999,5211,1933,19333,193333,3899,5577,133,199,1999,19999,28577,411,1377,177,599,5999,8577,9533,95333,136199,194577,8211,233,2333,23333,233333,6611,6011,60111,66799,9977,9077,3133,2411,24111,477}
复制代码

点评

你后面那个数串其实在28577之后就通过411进入循环了,总共用了51步而已。。。  发表于 2026-1-9 20:50
顺序方面233333最低毫不意外(因为它数值最大),但477能击败233和177成为最高流量入口倒是有点意外,说明47比23和17更容易成为首个最大素因数。。。  发表于 2026-1-9 20:48
有点好奇各个入口的具体频率数值是多少,最高和最低相差大不大?  发表于 2026-1-9 20:45
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-9 10:46:56 | 显示全部楼层
1e10~1e11的,过程中试图在2^60后面加数字的列表:
  1. f[n_]:=Print[NestWhileList[With[{p=FactorInteger[#][[-1,1]]},10 p+Mod[p,10]]&,n,# != 233 &]]
  2. f[11307204673]
  3. f[11791409233]
  4. f[12414334379]
  5. f[13657056769]
  6. f[13827439009]
  7. f[13909583543]
  8. f[16848542713]
  9. f[17090397589]
  10. f[18592301069]
  11. f[19525134929]
  12. f[19679131313]
  13. f[20014237777]
  14. f[22291198621]
  15. f[23957249651]
  16. f[23978654699]
  17. f[24597368179]
  18. f[26619166279]
  19. f[29478092513]
  20. f[30442286729]
  21. f[30661423589]
  22. f[33121043083]
  23. f[33746307233]
  24. f[34586315609]
  25. f[45676578803]
  26. f[46255881583]
  27. f[47082389489]
  28. f[50547274847]
  29. f[52455978703]
  30. f[53165107409]
  31. f[53433005149]
  32. f[53529277223]
  33. f[54818734343]
  34. f[56130999469]
  35. f[58031988299]
  36. f[60038162939]
  37. f[63596449373]
  38. f[64738897477]
  39. f[64863478679]
  40. f[65760248761]
  41. f[67913307653]
  42. f[68207723453]
  43. f[74058459929]
  44. f[76444275983]
  45. f[77651002453]
  46. f[77852418349]
  47. f[78557724629]
  48. f[78771156799]
  49. f[79750139351]
  50. f[80218841429]
  51. f[81139521473]
  52. f[81432060397]
  53. f[82559994893]
  54. f[83408220377]
  55. f[84141179387]
  56. f[84753966289]
  57. f[86050929967]
  58. f[87130079119]
  59. f[87202118849]
  60. f[90106652473]
  61. f[90920408399]
  62. f[91822444139]
  63. f[92418356099]
  64. f[96745464073]
复制代码

目前在做1e11-1e12,我每1G个数需要两分钟

点评

我10位数算完花了一个小时,11位数感觉需要20个小时,所以没有继续  发表于 2026-1-9 11:49
我在比原数小的时候停止。  发表于 2026-1-9 11:23
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-9 17:21:51 | 显示全部楼层
  1. Pcount[n_,p_]:=Module[{m=10^n,ps=Prime@Range[PrimePi[p]-1]},s={(-1)^Length@#,Times@@#}&/@Subsets[ps];
  2. Total@Table[Total[#1*Floor[m/(p^k*#2)]&@@@s],{k,Floor@Log[p,m]}]];
  3. Do[s=Pcount[12,p];
  4. Print[StringForm["10^12以内最大质因数为`1`的整数个数: `2`",p,s]],{p,{17,23,41,47,53,59}}]
复制代码


10^12以内最大质因数为17的整数个数: 11988011987
10^12以内最大质因数为23的整数个数: 7773819203
10^12以内最大质因数为41的整数个数: 3718025289
10^12以内最大质因数为47的整数个数: 3080856508
10^12以内最大质因数为53的整数个数: 2667386419
10^12以内最大质因数为59的整数个数: 2346328184

点评

这些各个【整数个数】就是【一步就进入循环】的个案,其实也就其中一种统计结果,绝大部分其他整数都是需要几步甚至几十步才进入循环的。。。  发表于 2026-1-9 20:43
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-9 22:41:59 | 显示全部楼层
回复 @毒酒滴冻鸭 在12#的评论/  我重新跑了一下, 10^8,统计了一下频率,其实在10^4的时候,排序已经开始保持稳定不变了.
  1. <|477->26155852,411->24058370,233->18190595,533->15549417,177->4254808,599->4218599,2333->3108062,8211->2843557,3133->1750705,1377->1091310,2411->919114,6011->642136,9077->520943,6611->427839,9533->360040,8577->326614,5999->262443,9977->211149,23333->155656,24111->63112,95333->55131,60111->41037,136199->36008,66799->28097,194577->12346,233333->11747|>
复制代码

代码如下
  1. acc=Association[];
  2. Do[acc[p]=0,{p,NestWhileList[With[{p=FactorInteger[#][[-1,1]]},10 p+Mod[p,10]]&,233,Length[#]<2||#!=233&,1,30]//Union}];
  3. mmm=20;Monitor[Do[temp=NestWhileList[With[{p=FactorInteger[#][[-1,1]]},10 p+Mod[p,10]]&,m,KeyExistsQ[acc,#]==False&,1,100];acc[Last[temp]]++;If[Length[temp]>mmm,Print[{m,Length[temp]}];mmm=Length[temp]],{m,10^8}],{m,ReverseSort[acc]}]
复制代码


同时记录了最大的路径长度,23244413 迭代到入口411的时候停止,此时长度是59,
  1. {23244413,232444133,2324441333,23244413333,3184166211,246834599,224395099,2243950999,19162699,4077177,1045433,143211,477377,280811,2808111,550611,203933,43399,433999,100933,144199,131099,42299,422999,32299,322999,3229999,50399,4999,49999,499999,1277,12777,42599,10399,103999,1799,2577,8599,85999,859999,175511,250733,433,4333,6199,61999,5211,1933,19333,193333,3899,5577,133,199,1999,19999,28577,411}
复制代码



10^9,最大长度是  429872893 迭代到入口411的时候停止,此时长度是60,
  1. {429872893,4298728933,42987289333,1134229277,11342292777,12602547533,12556099,125560999,1255609999,10020833,100208333,1002083333,143211,477377,280811,2808111,550611,203933,43399,433999,100933,144199,131099,42299,422999,32299,322999,3229999,50399,4999,49999,499999,1277,12777,42599,10399,103999,1799,2577,8599,85999,859999,175511,250733,433,4333,6199,61999,5211,1933,19333,193333,3899,5577,133,199,1999,19999,28577,411}
复制代码

点评

我是rust,多核  发表于 2026-1-10 08:19
你的10位数算完花了一个小时,是单核还是多核?(我C++写的,找因子用的笨办法,所以也没有特别快)  发表于 2026-1-9 23:16
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-10 00:41:22 | 显示全部楼层
我程序:
  1. // g++ -o c.exe -O2 -march=native c.cpp
  2. // f[n_]:=Print[NestWhileList[With[{p=FactorInteger[#][[-1,1]]},10 p+Mod[p,10]]&,n,# != 233 &]]

  3. #include <thread>
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <vector>
  7. #include <atomic>
  8. #include <bitset>
  9. using u8 = unsigned char;
  10. using u32 = unsigned;
  11. using u64 = unsigned long long;
  12. using u128 = __uint128_t;
  13. // Don't support -1ULL/val, /1
  14. struct V4div {
  15.         u32 val;
  16.         u8 shift, inc;
  17.         u64 mult;
  18.         V4div() = default;
  19.         V4div(u32 val): val(val) {
  20.                 shift = 63 - __builtin_clzll(val);
  21.                 if ((val & (val - 1) )== 0) {
  22.                         shift--;
  23.                         inc = 0;
  24.                         mult = 1ULL << 63;
  25.                         return; }
  26.                 u64 s = 0;
  27.                 u64 r = 1ULL << shift; // fprintf(stderr, "* %llu %llu\n", s, r);
  28.                 asm("div %2": "+a"(s), "+d"(r): "r"((u64)val));
  29.                 if (r <= val / 2) {
  30.                         mult = s;
  31.                         inc = 1;
  32.                 } else {
  33.                         mult = s + 1;
  34.                         inc = 0; }
  35.         }
  36.         friend u64 operator/(u64 a, V4div b) {
  37.                 return (u64)((a + b.inc) * (u128)b.mult >> 64) >> b.shift;
  38.         }
  39.         friend u32 operator%(u64 a, V4div b) {
  40.                 return a - a / b * b.val;
  41.         }
  42. };
  43. std::vector<V4div> Primes;



  44. static const unsigned M = 1000000, THC = 21;
  45. std::atomic<long long> Pbb = 100000000000ULL - M;

  46. u64 Gprimes(u64 x) {
  47.         long long ret = 1;
  48.         for (V4div i: Primes) {
  49.                 if (x < (u64 )i.val * i.val) break;
  50.                 while (x % i == 0) {
  51.                         ret = i.val;
  52.                         x = x / i;
  53.                 }
  54.         }
  55.         if (x > ret) ret = x;
  56. Retn:
  57.         return ret;
  58. }
  59. bool isPrime(unsigned long long i) {

  60.                 for (V4div j: Primes) {
  61.                         if (i % j == 0) return false;
  62.                         if (i / j < j.val) return true;
  63.                 }return true;
  64. }
  65. FILE* output = fopen("bad3.txt", "w");
  66. void f() {
  67.   while (1) {
  68.     unsigned long long  lb = Pbb += M;
  69.     fprintf(stderr , "%lld @ %ld\r", lb, clock()); if (lb > 1000000000000ULL) return;
  70.         for (unsigned long long  i=lb; i<lb+M; ++i) {
  71.                 if (!isPrime(i)) continue;
  72.                 unsigned long long  j=i;
  73.                 int rdo = 0;
  74.                 while (j >= i) {
  75.                         if (j > 1ULL << 60) {
  76.                                 fprintf(output , "ERROR OV i=%llu j=%llu\n", i,j); fflush(output);
  77.                                 goto fat;}
  78.                         if (rdo++==100) {
  79.                                 fprintf(output , "ERROR TLE i=%llu j=%llu\n", i,j); fflush(output);
  80.                                 goto fat;}
  81.                         j = j * 10 + j % 10;
  82.                         j = Gprimes(j);
  83.                 }
  84.                 if (rdo > 10) fprintf(output , "MSG TIME i=%llu j=%llu k=%d\n", i,j, rdo); fflush(output);
  85.                 fat:;
  86.         }
  87. }}
  88.                

  89. int main() {
  90. #if 0
  91.         std::bitset<-1U>& btpm = *new std::bitset<-1U>;
  92.         Primes.reserve(1<<28);
  93.         Primes.emplace_back(2);
  94.         Primes.emplace_back(3);
  95.         for (unsigned i = 5; i < -1U; ++i) {
  96.                 if (btpm[i] == 0) {
  97.                         Primes.emplace_back(i);
  98.                         for (unsigned long long j = i; j < -1U; j += i) btpm[j]=1; }
  99.                 NotPrime: ;
  100.                 if (i % 65536 == 0) fprintf(stderr, "P.%u\r", i);
  101.         }
  102.         delete &btpm;
  103.         printf("%zu Primes found\n", Primes.size());
  104. {FILE*pm=fopen("primes.dat","wb");fwrite(Primes.data(),sizeof(*Primes.data()),Primes.size(),pm);fclose(pm);}
  105. #else
  106. {FILE*pm=fopen("primes.dat","rb");Primes.resize(203280224);fread(Primes.data(),sizeof(*Primes.data()),Primes.size(),pm);fclose(pm);}printf("read Primes in %ld\n", clock());
  107. #endif
  108.         std::thread Th[THC];
  109.         for (int i=0; i<THC; ++i) {
  110.                 Th[i] = std::thread(f);
  111.         }
  112.         f();
  113.         for (int i=0; i<THC; ++i) {
  114.                 Th[i].join();
  115.         }
  116. }
复制代码
需要调整THC(使用核数-1)和int main()后的#if 0控制生成素数表还是读文件
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-10 08:22:37 | 显示全部楼层
用大模型写的rust代码,多核, 稍微手工改了下, 关于找最大素因子的部分,可以用素数表来继续优化/

  1. use rayon::prelude::*;
  2. use serde::Serialize;
  3. use std::fs::File;
  4. use std::io::Write;
  5. use indicatif::ProgressBar;

  6. #[derive(Serialize, Debug, Clone)]
  7. struct Result {
  8.     number: i64,
  9.     steps: u32,
  10. }

  11. // 找出一个数的最大素因子
  12. fn largest_prime_factor(mut n: i64) -> i64 {
  13.     if n <= 1 {
  14.         return -1;
  15.     }

  16.     let mut max_prime = -1;

  17.     // 处理因子2
  18.     while n % 2 == 0 {
  19.         max_prime = 2;
  20.         n /= 2;
  21.     }

  22.     // 处理因子3
  23.     while n % 3 == 0 {
  24.         max_prime = 3;
  25.         n /= 3;
  26.     }

  27.     // 轮式分解,步长6
  28.     let mut i = 5;
  29.     while i * i <= n {
  30.         while n % i == 0 {
  31.             max_prime = i;
  32.             n /= i;
  33.         }
  34.         while n % (i + 2) == 0 {
  35.             max_prime = i + 2;
  36.             n /= i + 2;
  37.         }
  38.         i += 6;
  39.     }

  40.     // 如果剩余的n > 1,则n本身是素数
  41.     if n > 1 {
  42.         max_prime = n;
  43.     }

  44.     max_prime
  45. }

  46. // 根据素因子生成新数字
  47. fn next_number(prime_factor: i64) -> i64 {
  48.     prime_factor * 10 + (prime_factor % 10)
  49. }

  50. // 计算从给定数字开始迭代到目标数的步数
  51. // 返回 (步数, 是否成功到达目标数)
  52. fn count_iterations(start: i64, target: i64) -> (u32, bool) {
  53.     let mut current = start;
  54.     let mut steps = 0u32;
  55.     let max_iterations = 10000; // 防止无限循环

  56.     while current != target && steps < max_iterations {
  57.         let prime = largest_prime_factor(current);
  58.         if prime <= 0 {
  59.             return (steps, false);
  60.         }

  61.         current = next_number(prime);
  62.         steps += 1;
  63.     }

  64.     if current == target {
  65.         (steps, true)
  66.     } else {
  67.         (steps, false)
  68.     }
  69. }

  70. // 输出迭代过程(调试用)
  71. fn print_iteration_path(start: i64, target: i64) {
  72.     println!("开始数字: {}", start);
  73.    
  74.     let mut current = start;
  75.     let mut steps = 0;
  76.     let max_iterations = 10000;

  77.     while current != target && steps < max_iterations {
  78.         let prime = largest_prime_factor(current);
  79.         if prime <= 0 {
  80.             println!("  无法继续,找不到素因子");
  81.             break;
  82.         }

  83.         let new_num = next_number(prime);
  84.         println!("  {} -> 素因子: {} -> {}", current, prime, new_num);

  85.         current = new_num;
  86.         steps += 1;
  87.     }

  88.     if current == target {
  89.         println!("  ✓ 到达{},用时 {} 步\n", target, steps);
  90.     } else {
  91.         println!("  ✗ 未到达{}\n", target);
  92.     }
  93. }

  94. // 导出为JSON格式
  95. fn export_to_json(results: &[(i64, u32)], filename: &str) -> std::io::Result<()> {
  96.     let json_results: Vec<Result> = results
  97.         .iter()
  98.         .map(|(number, steps)| Result {
  99.             number: *number,
  100.             steps: *steps,
  101.         })
  102.         .collect();
  103.    
  104.     let json = serde_json::to_string_pretty(&json_results)
  105.         .expect("Failed to serialize to JSON");
  106.    
  107.     let mut file = File::create(filename)?;
  108.     file.write_all(json.as_bytes())?;
  109.    
  110.     println!("✓ 已导出到: {}", filename);
  111.     Ok(())
  112. }

  113. // 导出为CSV格式
  114. fn export_to_csv(results: &[(i64, u32)], filename: &str) -> std::io::Result<()> {
  115.     let mut wtr = csv::Writer::from_path(filename)
  116.         .expect("Failed to create CSV writer");
  117.    
  118.     // 写入头部
  119.     wtr.write_record(&["number", "steps"])
  120.         .expect("Failed to write CSV header");
  121.    
  122.     // 写入数据
  123.     for (number, steps) in results {
  124.         wtr.write_record(&[number.to_string(), steps.to_string()])
  125.             .expect("Failed to write CSV record");
  126.     }
  127.    
  128.     wtr.flush()?;
  129.    
  130.     println!("✓ 已导出到: {}", filename);
  131.     Ok(())
  132. }

  133. fn main() {
  134.     println!("素因子分解迭代程序 v2.0");
  135.     println!("=================================\n");

  136.     // 获取命令行参数
  137.     let args: Vec<String> = std::env::args().collect();
  138.    
  139.     let mut min_num = 100i64;
  140.     let mut max_num = 999i64;
  141.     let mut target_num = 233i64;
  142.     let mut export_json = false;
  143.     let mut export_csv = false;
  144.     let mut skip_examples = false;
  145.     let mut sample_count: i64 = 0;
  146.     let mut positional_args = Vec::new();

  147.     // 解析参数
  148.     let mut i = 1;
  149.     while i < args.len() {
  150.         match args[i].as_str() {
  151.             "-h" | "--help" => {
  152.                 println!("【使用方法】");
  153.                 println!("  factorize [start] [end] [选项]");
  154.                 println!("\n【范围参数】");
  155.                 println!("  factorize 1000 2000   # 测试 1000 到 2000");
  156.                 println!("  factorize 1000        # 测试 1000 (单个数)");
  157.                 println!("  factorize 1000 --sample 50 # 测试从 1000 开始的 50 个数");
  158.                 println!("\n【导出选项】");
  159.                 println!("  --json          # 导出为JSON格式");
  160.                 println!("  --csv           # 导出为CSV格式");
  161.                 println!("  --target [num]  # 设置目标数字 (默认 233)");
  162.                 println!("  --skip-examples # 跳过示例测试");
  163.                 println!("\n【示例】");
  164.                 println!("  factorize 10000 10100 --json");
  165.                 std::process::exit(0);
  166.             }
  167.             "--target" => {
  168.                 if i + 1 < args.len() {
  169.                     if let Ok(n) = args[i+1].parse::<i64>() {
  170.                         target_num = n;
  171.                     }
  172.                     i += 1;
  173.                 }
  174.             }
  175.             "--json" => export_json = true,
  176.             "--csv" => export_csv = true,
  177.             "--skip-examples" => skip_examples = true,
  178.             "--sample" => {
  179.                 if i + 1 < args.len() {
  180.                     if let Ok(n) = args[i+1].parse::<i64>() {
  181.                         sample_count = n;
  182.                     }
  183.                     i += 1;
  184.                 }
  185.             }
  186.             arg => {
  187.                 if !arg.starts_with('-') {
  188.                     positional_args.push(arg);
  189.                 }
  190.             }
  191.         }
  192.         i += 1;
  193.     }

  194.     // 处理位置参数 (范围)
  195.     if !positional_args.is_empty() {
  196.         if let Ok(start) = positional_args[0].parse::<i64>() {
  197.             min_num = start;
  198.             max_num = start; // 默认为单个数
  199.             
  200.             if positional_args.len() >= 2 {
  201.                 if let Ok(end) = positional_args[1].parse::<i64>() {
  202.                     max_num = end;
  203.                 }
  204.             }
  205.         }
  206.     }

  207.     // 如果指定了 sample_count,覆盖 max_num
  208.     if sample_count > 0 {
  209.         max_num = min_num + sample_count - 1;
  210.     }
  211.    
  212.     // 确保 max >= min
  213.     if max_num < min_num {
  214.         max_num = min_num;
  215.     }

  216.     let total_count = max_num - min_num + 1;

  217.     // 示例测试(可跳过)
  218.     if !skip_examples {
  219.         println!("【示例测试】");
  220.         let test_numbers = vec![100, 77, 2, 10];
  221.         for &start in &test_numbers {
  222.             print_iteration_path(start, target_num);
  223.         }
  224.     }

  225.     // 多线程测试指定位数,带进度条
  226.     println!("\n【多线程测试范围 {}-{}】", min_num, max_num);
  227.     println!("正在计算中...\n");

  228.     let start_time = std::time::Instant::now();
  229.    
  230.     // 创建进度条
  231.     let pb = ProgressBar::new(total_count as u64);
  232.     pb.set_style(
  233.         indicatif::ProgressStyle::default_bar()
  234.             .template("{spinner:.green} [{wide_bar:.cyan/blue}] {pos}/{len} ({percent}%) ETA: {eta}")
  235.             .unwrap()
  236.             .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
  237.     );
  238.    
  239.     // 使用rayon进行并行处理
  240.     // 对于非常大的范围(例如9位数),一次性收集所有结果会消耗大量内存。
  241.     // 当数据量超过阈值时,采用流式聚合(仅保留top-k和计数)以节省内存。
  242.     let mut results: Vec<(i64, u32)> = Vec::new();
  243.     let mut success_count: usize = 0;
  244.     let threshold: i64 = 5_000_000; // 超过该值时使用流式聚合以节省内存

  245.     if total_count > threshold {
  246.         // 流式聚合:计算成功数量并保留前 k 个最长的记录
  247.         let k = 100usize;
  248.         let (topk, count) = (min_num..=max_num)
  249.             .into_par_iter()
  250.             .inspect(|_| { pb.inc(1); })
  251.             .filter_map(|num| {
  252.                 let (steps, success) = count_iterations(num, target_num);
  253.                 if success { Some((num, steps)) } else { None }
  254.             })
  255.             .fold(
  256.                 || (Vec::<(i64, u32)>::new(), 0usize),
  257.                 |mut acc, item| {
  258.                     acc.1 += 1usize;
  259.                     acc.0.push(item);
  260.                     if acc.0.len() > k {
  261.                         acc.0.sort_by(|a, b| b.1.cmp(&a.1));
  262.                         acc.0.truncate(k);
  263.                     }
  264.                     acc
  265.                 },
  266.             )
  267.             .reduce(
  268.                 || (Vec::<(i64, u32)>::new(), 0usize),
  269.                 |mut a, b| {
  270.                     a.1 += b.1;
  271.                     a.0.extend(b.0);
  272.                     a.0.sort_by(|x, y| y.1.cmp(&x.1));
  273.                     if a.0.len() > k { a.0.truncate(k); }
  274.                     a
  275.                 },
  276.             );

  277.         results = topk;
  278.         success_count = count;
  279.     } else {
  280.         results = (min_num..=max_num)
  281.             .into_par_iter()
  282.             .inspect(|_| { pb.inc(1); })
  283.             .filter_map(|num| {
  284.                 let (steps, success) = count_iterations(num, target_num);
  285.                 if success { Some((num, steps)) } else { None }
  286.             })
  287.             .collect();
  288.         success_count = results.len();
  289.     }
  290.    
  291.     pb.finish_with_message("完成!");

  292.     let elapsed = start_time.elapsed();

  293.     // 找出最大迭代步数和对应的数字
  294.     let (max_number, max_steps) = results
  295.         .iter()
  296.         .max_by_key(|(_, steps)| steps)
  297.         .copied()
  298.         .unwrap_or((min_num, 0));

  299.     // 统计信息
  300.     println!("统计结果:");
  301.     println!("  总共测试的数量:{} 个", total_count);
  302.     println!("  成功到达{}的数字:{} 个", target_num, success_count);
  303.     println!("  最大迭代步数:{} 步", max_steps);
  304.     println!("  迭代最长的数字:{}\n", max_number);
  305.     println!("  总耗时:{:.3} 秒\n", elapsed.as_secs_f64());

  306.     // 显示前10个迭代最长的数字
  307.     // 根据运行规模输出前 N 条(大规模时输出前100)
  308.     let top_n = std::cmp::min(results.len(), 100);
  309.     println!("【迭代步数最长的前{}个数字】", top_n);
  310.     results.sort_by(|a, b| b.1.cmp(&a.1));
  311.     for (i, &(num, steps)) in results.iter().take(top_n).enumerate() {
  312.         println!("  {}. {} -> {} 步", i + 1, num, steps);
  313.     }

  314.     // 显示最长的迭代详细过程
  315.     println!("\n【最长迭代过程详情】");
  316.     print_iteration_path(max_number, target_num);
  317.    
  318.     // 导出功能
  319.     if export_json {
  320.         println!("\n【数据导出】");
  321.         if let Err(e) = export_to_json(&results, &format!("results_{}_{}_{}.json", target_num, min_num, max_num)) {
  322.             println!("✗ 导出JSON失败: {}", e);
  323.         }
  324.     }
  325.    
  326.     if export_csv {
  327.         if let Err(e) = export_to_csv(&results, &format!("results_{}_{}_{}.csv", target_num,min_num, max_num)) {
  328.             println!("✗ 导出CSV失败: {}", e);
  329.         }
  330.     }
  331. }
复制代码

点评

差不多3天了,赞赞赞  发表于 2026-1-11 20:50
我12位最后是跑了20万秒,应该是不往下做了  发表于 2026-1-11 20:37
有道理。 我没继续跑了。感觉需要最好的算法  发表于 2026-1-11 20:33
我看你并没有处理64位溢出?  发表于 2026-1-11 19:40

评分

参与人数 1威望 +8 金币 +8 贡献 +8 经验 +8 鲜花 +8 收起 理由
northwolves + 8 + 8 + 8 + 8 + 8 很给力!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-11 19:39:29 | 显示全部楼层
12位跑完了。
文件格式:
MSG TIME i=<int> j=<int> k=<int> 从i到第一次小于i,位置是j,需要k步。仅记录k>10的情况。
ERROR OV i=<int> j=<int> 超过2^60的情况下试图*10,可能发生溢出。需要用其他手段(如Mathematica)测试

emath50145-12位异常.txt.gz

232.19 KB, 下载次数: 6, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

评分

参与人数 1威望 +8 金币 +8 贡献 +8 经验 +8 鲜花 +8 收起 理由
northwolves + 8 + 8 + 8 + 8 + 8 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2026-4-18 09:02 , Processed in 0.066477 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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