今日、私はthis article about decimal expansionに遭遇しました。Project Euler Problem 26に私の解決策を書き直して、より効果的なソリューション(無理な強制力なし)のためのこの新しい知識を追加しました。つまり、「1/d」という表現で繰り返し周期の長さを最大にするdの範囲1〜1000の値を見つけることが問題です。小数点の拡張で最も長い繰り返しサイクルを決定する
は、さらに問題を解決するeffecientyを向上させることができ、問題についてのさらなる仮定をすることなく、私が最も長い繰り返しサイクルを見つけるために、Dのいずれかの値を掲載して可能に
10^s=10^(s+t) (mod n)
に固執することを決定した(トン)とサイクルの開始点(s)を指定します。
モジュラスを使用することによって減少する前に非常に大きな値を生成するので、問題は方程式の一意の部分です。この大きな値を整数値で処理することはできず、浮動小数点データ型は誤って計算されているようです。
私は現在、このコードを使用しています:
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
はそのいくつかの点で計算する正しい結果ではない783で得られた "(10^47)MOD 983"。正しい結果は732であったはずです。積分データ型を使用しているためにオーバーフローが発生していると想定しています。私は代わりにダブルを使用してみましたが、それはさらに奇妙な結果をもたらしました。
私のオプションは何ですか?
私はそれについてはよく分かりませんでしたが、それは次の定義が成り立つことを意味します。 x * y mod 7 =(x mod 7)*(y mod 7) –
これは正しいです。 – AlbertoPL
Qua ---(x * y)mod 7 =((x mod 7)*(y mod 7))mod 7 – dave4420