今天我遇到了这篇关于十进制扩展的文章 http://mathworld.wolfram.com/DecimalExpansion.html我立即受到启发,重新修改我的解决方案包含这些新的数学知识以获得更有效的解决方案(无暴力破解)。简而言之,问题是找到 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 代替,但这给出了更奇怪的结果。
那么我有什么选择呢?
我不会使用 ^ 来执行您的操作,而是使用乘法进行 for 循环,然后通过使用条件检查计算的数字是否大于 mod 来取数字的 mod。这有助于使数字更小并在您的模组编号范围内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)