web-dev-qa-db-ja.com

大きな数を処理する方法は?

さて、私はパズルを始めたばかりで、簡単に実行できるが非常に大きな数を処理する必要があるパズルを見るのはとても面倒です。それが問題です。

10 ^ 6/2147483647 /などの数値を処理する必要があるとしましょう。算術演算を実行する必要があります!

しかし、これらは力ずくで扱われるべきではないと私は感じますが、数学の定理/ステートメントは時々私の心の中でクリックしないだけです。

どうすればこのようなパズルを処理できますか(外部libを使用しないでください)

7
0cool

暗号化に使用されるのと同じ理由で、対処するのが難しいため、コードチャレンジで多数が使用されます。ほとんどの言語用のBigIntクラスがあり、それらをより管理しやすくするのに役立ちます。ほとんどのコードの課題は、最小限の数を処理しながら解決できますが、絶対に必要になるまで大きな数を処理する必要を回避する方法を見つける賢い解決策があります。

6
Ryathal

正確な解決策は実際の問題によって異なりますが、arbitraryまたはmultiple高精度数学ライブラリ(BigInt、 GMP、MPFR、ARPRECなど)。

まず、いくつかの数学を使用します。式を簡略化できますか?これらのタスクのソースにはパズルが含まれるとおっしゃいましたが、これはパズルの要因となる可能性があるため、解決策としてこのアプローチを検討する傾向があります aha 瞬間。 二項確率 などの階乗を含む方程式は、通常、ブルートフォースではなく、数学的手法を使用して簡略化または計算できます(間接的に)。

Factoring 数値と一般的な要因のキャンセルは、必要に応じて、私が最初に試すことの1つです。 多倍精度計算機 が役立ちます。

質問またはその値を別の底(例:2進数、16進数)または差スケール(例:対数の底2、10、またはe-naturalのいずれかで再構成します。 =)値を扱いやすくしますか?対数目盛の1つの例は、RFおよびオーディオレベルに使用される decibel です。

今日ではあまり教えられていないが、プログラマー、エンジニア、数学者の間でよく知られている 計算尺 に詳しい技術を使用すると役立つ場合があります。

質問によっては、最初に 近似 を実行すると、マニューシャが問題を独創的に攻撃するのを邪魔するのを妨げることにより、正解に向かって 誘導 を行うことができます。

あなたの例のために;関連する(近似)が単純化された方程式を計算します。

 \frac{10^6}{2147483647} ≅ \frac{1 * 10^6}{2 * 10^9} \frac{1 * 10^6}{2 * 10^9} = \frac{1}{2} * \frac{10^6}{10^9} \frac{1}{2} * \frac{10^6}{10^9} = 0.5 * 10^{-3} = 0.0005

正解または正確な答えに非常に近い

別の「トリック」は、modulomod%moduloa \bmod n)これは私の数を減らすための私のお気に入りの方法の1つなので、基本的な抽象代数を知っている場合は、 モジュラー算術 を使用できることがあります。

これは、大量の数値を含む「パズル」の方程式またはプログラミングの問題にどのようにアプローチするかを示す、非常に大まかなガイドです。

4
mctylr

すべてのプログラミング言語は大きな数値の使用をサポートしています。標準ライブラリで直接サポートしているものもあれば、この目的のために作成された特別なライブラリがあるものもあります(いくつかでも)。

整数に問題がない限り、多くの言語に存在するBigIntegerのようなものを探す必要があります。実数が必要な場合は、 任意精度演算 ライブラリを探す必要があります。

ここではいくつかの例を示します。

  • Javaには組み込み BigInteger クラスがあり、任意精度に関する情報は StackOverflow にあります。
  • .Netには BigInteger および W3b.Sine があります
  • Pythonには、BigIntegerと浮動小数点の mpmath も備わっています。
1

パズルの課題に取り組んでいて、大きな数が表示され始めた場合、課題は答えを見つけるのではなく(他の人が指摘しているように、大きな数を処理するためのライブラリーが存在します)、むしろ課題は大量のデータを扱う独自のライブラリ。通常、いくつかの異なるメモリ空間に何らかの方法で数値を分割する必要があるため、これは非常に困難な場合があります。整数の場合、読み取りと実装に時間がかかる場合、これはかなり簡単です。ただし、浮動小数点値のサポートは間違いなくあなたの数学のスキルを向上させます!

開始するには、以下のサイトにいくつかのオープンソースコードがあり、それらを読んで数字がどのように機能するかを確認することができます。

さらに、任意精度の算術に関するウィキペディアのページでは、興味深い方向性についても説明しています。

1
rjzii

これらは特に大きな数ではありません。あなたの例は、典型的なx86コンパイラのCの「unsigned int」または「long」でサポートされている範囲内にあり、pythonのバニラ構成は、自動的に任意精度の計算をサポートします。問題の一部Python "^"は指数演算子ではなく、ビット単位の 'XOR'演算子です。代わりに10 ** 6を使用してください。整数の除算を使用すると、答えはゼロになります。代わりに浮動小数点除算を行いますか?

0