2011-08-05 14 views
1

大きな数値(浮動小数点数、double int、その他のデータ型の範囲を超える)で算術演算を行うアルゴリズムが必要です。私はC言語でコードを書く必要があります。Knuth、Donald、コンピュータプログラミングの技術、ISBN 0-201-89684-2、第2巻:Seminumerical Algorithms、Section 4.3.1:古典的アルゴリズムしかしそれに耐えられなかった。私はコードではなくアルゴリズムが必要です。非常に大きな数値で算術演算を行うアルゴリズム

+0

にアルゴリズムを探すことができます。リスト内の単一のノードは、その番号の1桁を保持します。 –

+0

GMP(http://gmplib.org/)やJavaの 'BigInteger'クラスのような既存のライブラリをいつでもリバースエンジニアリングすることができます。ソースコードはhttp://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/math/java/math/BigInteger.java.htmから入手できます。 –

+7

人間は、どうやって非常に大きな数値で算術演算を実行しますか?あなたのアルゴリズムは、少なくとも出発点です... –

答えて

3

私が知る限り、単純な線形O(n)アルゴリズムよりはるかに良くなるわけではありません。とにかく、入力全体を読む必要があるので、少なくとも直線的です。あなたは定数を得るために様々なトリックを行うことができるかもしれません。

あなたの主な問題は、基本的な長い乗算アルゴリズムの2次的性質のために、乗算になります。 hereと与えられたいくつかのはるかに高速な方法の1つを考えてみてください。 Karatsubaメソッドはうまく実装するのが少し難解ですが、おそらく最も簡単なアルゴリズムであり、これはあなたに利益を与えるでしょう。それ以外の場合は、Schönhage-Strassen's algorithmFürer's algorithmなど、高速フーリエ変換の方法をもう少し見ていく必要があります。

Big O notationも参照してください。

+1

私は学校プロジェクトのために、1年生の大学生として単純なFFTベースの乗算(〜Fürerの方法)をC言語で実装しました。数字レシピには興味深いものがいくつかありますが、それほど難しいものではありません。 –

0

Knuth vol 2またはCrandallとPomeranceを読んでください。コーディングのために、Karatsubaまたはフーリエ変換に移行する前に、明白なアルゴリズムが最初に機能するようにすることをお勧めします。

1

書籍因数分解のための素数と計算機方法には、多精度演算のための読みやすいコードが付いています。

3

私は、Karatsubaアルゴリズムは大きな数の算術演算を実行するのが最善であると考えます。十分大きなnに対して、Schönhage-Strassenアルゴリズムの一般化はさらに高速です。 あなたが大規模な数としてリンクされたリストを使用することができ、宿題のために Karatsuba または Karatsuba_Multiplication

関連する問題