vb.net - 确定十进制扩展中的最长重复循环

标签 vb.net math

今天遇到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 部分,因为这会在使用模数减少它们之前生成非常大的值。没有整数值可以处理这么大的值, float 据类型似乎计算错误。

我目前正在使用此代码:

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 循环,然后在您进行时通过使用条件检查计算的数字是否大于模数来获取数字的模数。这有助于使数字更小并保持在您的模数范围内。

关于vb.net - 确定十进制扩展中的最长重复循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080691/

相关文章:

c - x86 上的有符号和无符号算术实现

matlab - 使用 MATLAB 将对数螺旋图像的白色部分转换为散点图

.net - 如何使用 VB.NET 获取 Excel 文件的确切行数?

arrays - 如何生成多个数组的所有排列/组合?

vb.net - 多线程分组算法

.net - 如何给button.text 添加文本轮廓?

.net - 键入时,如何在文本框中将值格式化为货币(例如123,456.50)?

c++ - 如何将数学矩阵转换为 Direct3D 矩阵?

r - 计算 3D (NED) 地理坐标(纬度、经度、深度)之间的距离

algorithm - 将数字转换为特定范围内的等效数字