【发布时间】: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 代替,但结果更奇怪。
那么我的选择是什么?
【问题讨论】: