【问题标题】:Determing longest repeating cycle in a decimal expansion确定十进制扩展中的最长重复周期
【发布时间】:2009-07-03 20:08:59
【问题描述】:

今天我遇到了this article about decimal expansion,我立刻受到启发,想在Project Euler Problem 26 上重新设计我的解决方案,以包含这种新的数学知识,以获得更有效的解决方案(没有暴力破解)。简而言之,问题是找到 1-1000 范围内的 d 值,这将使表达式“1/d”中的重复循环的长度最大化。

没有对可以进一步提高解决问题效率的问题做任何进一步的假设,我决定坚持

10^s=10^(s+t) (mod n)

这允许我对任何 D 值找到最长的重复循环 (t) 和循环的起点 (s)。

问题在于方程的 eksponential 部分,因为这会在使用模数减少之前生成非常大的值。没有整数值可以处理这么大的值,而且浮点数据类型似乎计算错误。

我目前正在使用此代码:

Private Function solveDiscreteLogarithm(ByVal D As Integer) As Integer
Dim NumberToIndex As New Dictionary(Of Long, Long)()
Dim maxCheck As Integer = 1000

For index As Integer = 1 To maxCheck
   If (Not NumberToIndex.ContainsKey((10 ^ index) Mod D)) Then
        NumberToIndex.Add((10 ^ index) Mod D, index)
   Else
        Return index - NumberToIndex((10 ^ index) Mod D)
   End If
Next

Return -1
End Function

在某些时候会计算 "(10^47) mod 983" 导致 783 这不是正确的结果。正确的结果应该是 732。我假设这是因为我使用的是整数数据类型并且它会导致溢出。我尝试使用 double 代替,但结果更奇怪。

那么我的选择是什么?

【问题讨论】:

    标签: vb.net math


    【解决方案1】:

    我不会使用 ^ 来做你的权力,我会使用乘法做一个 for 循环,然后通过使用条件检查计算的数字是否大于 mod 来获取数字的 mod。这有助于保持数字更小,并在您的 mod 编号范围内。

    【讨论】:

    • 我不太确定,但这意味着以下定义是否成立? x*y mod 7 = (x mod 7 ) * (y mod 7)
    • Qua --- (x * y) mod 7 = ((x mod 7) * (y mod 7)) mod 7
    • 好的,刚刚测试过,它运行完美。谢谢一堆。不敢相信我错过了这个定义。我什至浏览了试图找到它。我想我应该自己尝试推断一下。
    【解决方案2】:

    我会从我自己的解决方案中给你一个提示。

    分数的每一个小数扩展,你都会得到一个余数,如果乘以当前小数位,就是一个整数。由于这个余数是确定下一个小数展开式所需的全部内容,因此您可以使用它来预测后续展开式。

    【讨论】:

    • 我不太确定我是否关注你。我实际上并没有直接进行任何小数扩展。
    【解决方案3】:

    有关其他问题,请参阅我的帖子getting the nth digit of a fraction,您可能会发现一些有用的线索来尝试什么。 (我认为答案是小于 1000 的最大素数。)(更正:最大素数或Carmichael number 小于 1000。)

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多