Collatz猜想脚本50K步数值重复:代码问题还是预期现象?
关于Collatz猜想测试中重复出现特定步数数值的分析
核心结论
这种重复现象大概率是Collatz序列的正常收敛特性,而非代码问题,但仍需简单验证代码逻辑以排除疏漏。
重复50000步数值的原因
- 你用初始数持续减去
2^777-1(一个777位的全1二进制奇数),本质是对初始数做奇数偏移。但Collatz变换的关键规律是:无论初始数多大,经过足够多的变换后,都会快速落入收敛路径。大量这类偏移后的数,在50000步内会被变换到相同的中间状态,因此出现重复的冰雹数。 - 二进制层面看,
2^777是极高位的2的幂,减去1后仅影响高位的连续1位,但Collatz变换对低位更敏感——偶数直接右移,奇数通过3n+1转为偶数后右移。多数情况下,高位的这类偏移在50000步内会被“抹平”,最终进入相同的分支。
超长步数的合理性
偶尔出现的3830777步属于正常情况:少数初始数的变换路径会进入更长的分支,但最终仍会收敛到1(符合Collatz猜想的假设)。这类超长路径只是个别特例,不影响整体收敛趋势。
代码验证要点
若仍怀疑代码问题,可做以下验证:
- 用已知长路径的小整数(如27,已知需111步到1)测试,对比序列是否正确,确认
3n+1和n/2的核心逻辑无错。 - 检查文件写入逻辑:确保每50000步写入的是当前实时计算的数值,无变量覆盖或计数错误。
- 抽取前几步的大整数运算结果,手动计算验证变换是否正确(PowerShell原生支持大整数,一般不会有精度问题)。
你的代码与输出示例
PowerShell实现代码:
function Invoke-Collatz { param( [bigint]$InitialNumber, [int]$StepInterval = 50000, [string]$OutputPath = "collatz_steps.txt" ) $current = $InitialNumber $stepCount = 0 while ($current -ne 1) { $current = if ($current % 2 -eq 0) { $current / 2 } else { 3 * $current + 1 } $stepCount++ if ($stepCount % $StepInterval -eq 0) { Add-Content -Path $OutputPath -Value "Step $stepCount : $current" } } Add-Content -Path $OutputPath -Value "Final Step $stepCount : $current" }
运行输出片段:
Step 50000 : 3819XXXX... Step 50000 : 9373XXXX... Step 3830777 : 1
内容的提问来源于stack exchange,提问作者Tom Gordon
相关产品推荐
相关产品推荐

