部分に格納されている整数に対して乗算と除算 (および場合によってはモジュラス) を行う方法についての指示をどこで入手できるか知っている人はいますか? uint128_t
asを格納するライブラリを作成していuint64_t UPPER, LOWER
ます。
4 に答える
GMP
図書館をご存知ですか?独自のものを実装する代わりに、それを使用してみませんか?
上記のリンクから、tar.bz
Unix ベースの OS 用のファイルをダウンロードできます。
Windows の場合は、次のリンクを参照してください。
MinGW、MSVC++、および CgyWin に関する多くの情報とインストール ファイルが含まれています。必要に応じてダウンロードしてください。次のリンクも参照できます。
インストールと構成が完了したら、GMP を使用してプログラミングする方法を知りたい場合は、次のリンクを参照してください。
このように数を分割することは、カラツバ掛け算の理想的な前提条件です。検討:
x = x1 * 2^k + x2
y = y1 * 2^k + y2
スクール乗算を使用すると、4 つの乗算が必要になります。
x*y = (x1*y1) * 2^(2*k) + (x1*y2 + x2*y1) * 2^k + x2*y2
カラツバにはさらにいくつかの足し算が必要ですが、掛け算は 3 つだけです。
p1 = x1 * y1
p2 = x2 * y2
x*y = p1 * 2^(2*k) + ((x1+x2)*(y1+y2) - p1 - p2) * 2^k + p2
もちろん、問題はオーバーフローをどのように処理するかです。
http://en.wikipedia.org/wiki/Arbitrary-precision_arithmeticは良い出発点かもしれません。オープンソースのライブラリはすでにたくさんあります
さまざまな Big Integer ライブラリを見てください。Google が見つけたものを次に示します https://mattmccutchen.net/bigint/