You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:15:52