2009-07-03 1 views
2

今日、私は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であったはずです。積分データ型を使用しているためにオーバーフローが発生していると想定しています。私は代わりにダブルを使用してみましたが、それはさらに奇妙な結果をもたらしました。

私のオプションは何ですか?

答えて

6

^を使ってあなたの力を行うのではなく、forループを乗算を使って行い、条件式を使って計算された数値がmodよりも大きいかどうかをチェックします。これは、数字を小さくして、あなたのmod番号の範囲内に保つのに役立ちます。

+0

私はそれについてはよく分かりませんでしたが、それは次の定義が成り立つことを意味します。 x * y mod 7 =(x mod 7)*(y mod 7) –

+1

これは正しいです。 – AlbertoPL

+2

Qua ---(x * y)mod 7 =((x mod 7)*(y mod 7))mod 7 – dave4420

1

私はこれに私自身の解決策からヒントを与えます。

小数点の各小数点の展開では、剰余が得られます。剰余は、現在の小数点以下の桁数を乗算すると整数です。この残りの部分は次の小数点の展開を決定するために必要なものなので、それを使って後続の展開についての予測を行うことができます。

+0

私はあなたに従うことは確かではありません。実際に小数点の展開は直接行っていません。 –

関連する問題