問題タブ [bignum]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bitwise-operators - BigNum にビットが設定されているかどうかを確認します
「123456789123456789123456789」のような文字列のようにフォーマットされたbignumがあり、指定されたビットが設定されているかどうかを確認する必要があります。コンポーネントは、この文字列の 1 桁の数字です。
ビット54が設定されているかどうかを確認したい場合は、通常、次のようにします: NyNumber&(1<<54)
問題は、使用している bignum ライブラリに AND または SHIFT がないことです。
問題は次のとおりです。任意のサイズの文字列のようにフォーマットされた数値にビットが設定されているかどうかを確認するにはどうすればよいですか?
編集: 明確にするために: 私は次のライブラリでAutoit3と呼ばれる小さなスクリプト言語を使用しています: http://www.autoitscript.com/forum/topic/83529-bignum-udfこれは BigNums を文字列として表します。
ruby - Math.SqrtがFloatではなくBignumを返すようにするにはどうすればよいですか?
Rubyで本当に大きな数の平方根を計算しようとしています。私が抱えている問題は、Math.sqrt関数が次のようになっていることです。
sqrt(numeric) → float
非常に大きな数をフィードすると、FloatDomainError:Infinityが表示されます。
sqrt()
BigNumを返すための最良の方法は何ですか?これにはおそらく宝石がありますか、それとも平方根を計算するために独自の関数を作成する必要がありますか?
その場合、これを行うための最も簡単な方法は何ですか?テイラー級数?数値の平方根は常に整数になります。
ruby-on-rails - Rails: 256 ビットのチェックサムをバイナリとしてデータベースに保存する
列に SHA-2 256 ビット チェックサムを格納しようとしています。
私は次のように値を保存しています:
big_num を c.value に割り当てると、次のようになります。
私が間違っていることを知っている人はいますか?
c++ - 巨大数の効率的なべき乗(私はグーゴルについて話している)
私は2^(n-1)を解く単純な組み合わせ問題を解いている最中です。
唯一の問題は、1 <= n <= 2 ^ 31 -1(符号付き32ビット整数の最大値)です。
JavaのBigIntegerクラスを使用してみましたが、2 ^ 31/10 ^ 4以上の数値でタイムアウトになるため、明らかに機能しません。
さらに、JavaまたはC++の組み込みクラスのみを使用するように制限されています。
速度が必要であることを知って、文字列の算術演算を行うC++でクラスを作成することにしました。
さて、私が掛け算をするとき、私のプログラムは、効率のために(文字列を繰り返し追加するのではなく)紙の上で掛け算するのと同じように掛け算します。
しかし、それでも、2を単独で2 ^ 31-1倍することはできません。それは、十分に効率的ではありません。
それで私は問題についてのテキストを読み始めました、そして私は解決に至りました...
2^n = 2^(n/2) * 2^(n/2) * 2^(n%2)
(ここで、/は整数除算を示し、%は係数を示します)
これは、対数の乗算でべき乗を解くことができることを意味します。しかし、私には、このメソッドをコードに適用する方法を回避できませんか?下限を選択するにはどうすればよいですか。また、最終的な乗算に必要なさまざまな数値を追跡するための最も効率的な方法は何ですか。
この問題を解決する方法について誰かが知っている場合は、詳しく説明してください(サンプルコードをいただければ幸いです)。
アップデート
皆様のご協力に感謝します!java.math.BigInteger
明らかに、この問題は現実的な方法で解決されることを意図していますが、ceil(log2(n))の反復のみを実行するべき関数でなんとかアウトパフォームしました。
誰かが私が作成したコードに興味があるなら、ここにあります...
c++ - x86 での 2 つの 128 ビット整数の効率的な乗算/除算 (64 ビットなし)
コンパイラ: MinGW/GCCの
問題: GPL/LGPL コードは許可されていません (GMP やその他の bignum ライブラリは、既にクラスを実装しているため、この問題には過剰です)。
私は独自の128 ビットの固定サイズの大きな整数クラス (ゲーム エンジンでの使用を意図していますが、あらゆる使用ケースに一般化される可能性があります) を作成しましたが、現在の乗算および除算演算のパフォーマンスは非常にひどいものであることがわかりました (はい、私はそれらの時間を測定しました。以下を参照してください) 、低レベルの数値処理を行うアルゴリズムを改善 (または変更) したいと考えています。
乗算演算子と除算演算子に関して言えば、クラスの他のほぼすべての演算子と比較して、耐えられないほど遅いです。
これらは、自分のコンピューターと比較したおおよその測定値です。
ご覧のとおり、掛け算だけを行うのは、足し算や引き算よりも何倍も遅くなります。除算は、乗算よりも約 10 倍遅くなります。
フレームごとに非常に大量の計算が行われる可能性があるため (内積、さまざまな衝突検出方法など)、これら 2 つの演算子の速度を改善したいと考えています。
構造 (メソッドは省略) は次のようになります。
乗算は現在、典型的なlong-multiplicationメソッドを使用して (出力をキャッチできるようにアセンブリでEDX
) 実行されますが、範囲外になる単語は無視されます (つまり、mull
16 と比較して 10 のみを実行しています)。
除算はシフト減算アルゴリズムを使用します (速度はオペランドのビット数に依存します)。ただし、アセンブリでは行われません。集めるのが少し難しすぎることがわかり、コンパイラーに最適化させることにしました。
カラツバ乗算、高基数除算、ニュートンラプソン除算などのアルゴリズムを説明するページを数日間 Google で調べましたが、数学記号は頭の中に少しありすぎます。これらの高度な方法を使用してコードを高速化したいのですが、最初に「ギリシャ語」をわかりやすいものに翻訳する必要があります。
私の努力を「時期尚早の最適化」と見なす可能性のある人のために。非常に基本的な数学演算自体が遅くなるため、このコードがボトルネックになると考えています。高レベルのコードでは、このようなタイプの最適化は無視できますが、このコードは十分に呼び出されたり使用されたりします。
乗算と除算を改善するために使用するアルゴリズムについての提案 (可能であれば) と、提案されたアルゴリズムがどのように機能するかについての基本的な (できれば理解しやすい) 説明をいただければ幸いです。
編集:乗算の改善
コードを operator*= にインライン化することで乗算演算を改善することができ、可能な限り高速に見えます。
調べる必要のある最低限のコードを次に示します (私のタイプ名は実際には異なることに注意してください。これは簡単にするために編集されています)。
除算に関しては、実質的な利点を確認するには数学的アルゴリズムを変更する必要があるため、コードを調べることはあまり意味がありません。実行可能な唯一の選択肢は高基数除算のようですが、それがどのように機能するかについてはまだ (私の頭の中で) 解決していません。
performance - 長整数ルーチンは SSE の恩恵を受けることができますか?
私はまだ C++ で任意の長整数のルーチンに取り組んでいます。これまでのところ、64 ビット Intel CPU の加算/減算と乗算を実装しました。
すべて正常に動作しますが、SSE を使用して少し高速化できないかと考えました。SSE ドキュメントとプロセッサ命令リストを参照しましたが、使用できると思われるものを見つけることができませんでした。その理由は次のとおりです。
SSE には整数命令がいくつかありますが、ほとんどの命令は浮動小数点を処理します。整数で使用するように設計されているようには見えません (例えば、less の整数比較はありますか?)
SSE の考え方は SIMD (同じ命令、複数のデータ) であるため、2 つまたは 4 つの独立した操作の命令を提供します。一方、私は128ビットの整数加算(128ビットの入力と出力)のようなものを持ちたいと思っています。これは存在しないようです。(まだ?AVX2で?)
整数の加算と減算は、入力キャリーも出力キャリーも処理しません。そのため、手動で行うのは非常に面倒です (したがって遅い)。
私の質問は次のとおりです。私の評価は正しいですか、それとも見落としているものはありますか? 長整数ルーチンは SSE の恩恵を受けることができますか? 特に、add、sub、または mul ルーチンをより迅速に作成するのに役立ちますか?
ios - iOS vecLib vU1024 データ型を初期化するにはどうすればよいですか?
iOS vecLib BigNum.h vU1024 データ型を使用して、数値で初期化するにはどうすればよいですか?
たとえば、そこに大きな数字 938429845792837192837293487293458734985791823123918237 を取得するにはどうすればよいですか?
ありがとう。
lisp - 次の文法を前提として、Schemeでbignumを実装するにはどうすればよいですか?
Schemeには任意の数を処理するためのBignum型が組み込まれていると思いますが、自分で実装したい場合はどうすればよいですか?
私が間違っていなければ、次の文法があります:| n | =()n = 0 |n|の場合 =(r。| q |)ここで、n = qN + r、0 <= r
例:ベースN = 16の場合、| 33 | =(1 2)1が剰余である場合、2は商です。
PS:bignum実装を使用して、次の番号(後続)と前の番号(先行)に移動するにはどうすればよいですかsuccessor |n| = |n+1|
?predecessor |n+1| = |n|
c - Cのカスタムデータ型
私は暗号化を使用しており、非常に大きな数を使用する必要があります。また、浮動小数点データを引数として取り込む関数をロードすることで実行されるm128iデータ型を必要とするキャリーレス乗算用の新しいIntel命令を使用しています。
2 ^ 1223整数を格納してから、それを2乗して、その値も格納する必要があります。
GMPライブラリを使用できることはわかっていますが、2^1224と2^2448のような値を格納する2つのデータ型を作成する方が速いと思います。オーバーヘッドが少なくなります。カラツバを使用して数値を乗算するため、データ型に対して実行する必要がある操作は、m128iに合わせて数値を分割するため、加算のみです。
誰かが私に必要な整数のサイズを作成するのを助けることができる材料に向かう方向に私を導くことができますか?
c# - C#で任意精度の演算がサポートされていますか?
C#は任意精度の演算をサポートしていますか(これはbignumとも呼ばれると思います)?
そうでない場合、どのライブラリがそれをサポートしますか?