導入
大きな 10 進数の乗算は、特に桁数や小数点以下の桁数が多い数値を扱う場合、計算が困難になることがあります。従来の乗算方法は、数値が非常に大きい場合には非効率的になります。ここで高速フーリエ変換 (FFT) が役に立ち、大きな数を驚異的な速度で乗算するための強力かつ効率的なアルゴリズムを提供します。
掛け算への応用
- FFT は、数値を周波数領域に変換し、点単位の乗算を実行してから逆 FFT を適用することにより、多項式または大きな整数の高速乗算を可能にします。
大きな数の掛け算への挑戦
従来の乗算方法の時間計算量は O(n²) (n は桁数) です。非常に大きな数の場合、計算コストが高くなります。 FFT ベースの乗算アルゴリズムは、この複雑さを O(n log n) に軽減し、大きな数に対して大幅に高速化します。
Cooley-Tukey FFT の証明の概要
-
離散フーリエ変換 (DFT) の分解:
- DFT は次のように定義されます。
Xk = n=0∑N−1 xn⋅ e−2πi⋅kn /N、どこ N は入力信号のサイズです。
- Cooley-Tukey FFT は、計算をより小さなサイズの DFT に分割します。
N/2
偶数インデックスの用語と奇数インデックスの用語を分けることにより、次のようになります。
Xk = n=0∑N/2−1 x2n ⋅e −2πi⋅(2n)k/N n=0∑N/ 2−1x2n 1⋅ e−2πi⋅(2n 1)k/N.
- これは次のようになります。
Xk =偶数項の DFT Wk⋅奇数項の DFT、どこ Wk =e−2πi ⋅k/N .
- DFT は次のように定義されます。
-
再帰構造:
- サイズの各 DFT N サイズが異なる 2 つの DFT に分割されます。 N/2 、再帰的な構造につながります。
- この再帰的な除算は、サイズの基本ケースが得られるまで継続されます。 N=1 この時点では、DFT は単なる入力値です。
-
バタフライオペレーション:
- アルゴリズムは、バタフライ演算を使用して、より小さな DFT からの結果をマージします。
a'=u Wk⋅v,b' =u−Wk⋅v,どこ u そして v はより小さな DFT の結果であり、 Wk 団結の根源を表します。
- アルゴリズムは、バタフライ演算を使用して、より小さな DFT からの結果をマージします。
-
ビット反転順列:
- 入力配列は、インプレース計算を可能にするために、インデックスのバイナリ表現に基づいて並べ替えられます。
-
時間計算量:
- 再帰の各レベルには、 N 単一根を含む計算、再帰の深さは次のとおりです。 log2 (N) .
- これにより、時間計算量は次のようになります。 O(NlogN) .
逆FFT
- 逆 FFT は似ていますが、以下を使用します。 e 2πi⋅kn/N を基準として結果をスケールします 1/N .
FFT乗算アルゴリズムを理解する
FFT 乗算アルゴリズムは、いくつかの重要なステップを通じて機能します。
-
数値の前処理
- 入力数値を数字の配列に変換します
- 整数部分と小数部分の両方を処理します
- FFT 計算のために配列を最も近い 2 のべき乗にパディングします
-
高速フーリエ変換
- FFT を使用して数値配列を周波数領域に変換します
- これにより、乗算の問題が周波数領域でのより単純な点ごとの乗算に変換されます
-
周波数領域の乗算
- 変換された配列の要素ごとの乗算を実行します
- 効率的な計算のために複素数演算を利用する
-
逆 FFT と結果処理
- 乗算された配列を時間領域に変換して戻します
- ハンドル桁桁
- 最後の 10 進数を再構築します
実装の主要なコンポーネント
複素数表現
class Complex { constructor(re = 0, im = 0) { this.re = re; // Real part this.im = im; // Imaginary part } // Static methods for complex number operations static add(a, b) { /* ... */ } static subtract(a, b) { /* ... */ } static multiply(a, b) { /* ... */ } }
Complex クラスは FFT 演算を実行するために重要であり、実数領域と虚数領域の両方で数値を操作できるようになります。
高速フーリエ変換機能
function fft(a, invert = false) { // Bit reversal preprocessing // Butterfly operations in frequency domain // Optional inverse transformation }
FFT 関数はアルゴリズムの中核であり、時間領域と周波数領域の間で数値を効率的に変換します。
10 進数の処理
実装には、10 進数を処理するための高度なロジックが含まれています。
- 整数部分と小数部分の分離
- 小数点以下の合計桁数の追跡
- 正しい小数点の位置で結果を再構築する
使用例の例
// Multiplying large integers fftMultiply("12345678901234567890", "98765432109876543210") // Multiplying very large different size integers fftMultiply("12345678901234567890786238746872364872364987293795843790587345", "9876543210987654321087634875782369487239874023894") // Multiplying decimal numbers fftMultiply("123.456", "987.654") // Handling different decimal places fftMultiply("1.23", "45.6789") // Handling different decimal places with large numbers fftMultiply("1234567890123456789078623874687236487236498.7293795843790587345", "98765432109876543210876348757823694.87239874023894")
パフォーマンス上の利点
- 時間計算量: 従来の手法の O(n²) と比較した O(n log n)
- 精度: 小数点以下複数桁の非常に大きな数値を処理します
- 効率: 大きな数の乗算が大幅に高速化
制限事項と考慮事項
- 複素数表現には追加のメモリが必要です
- 精度は浮動小数点演算の影響を受ける可能性があります
- 従来の乗算と比較して実装が複雑です
結論
FFT 乗算アルゴリズムは、大きな数を効率的に乗算するための強力なアプローチを表します。周波数領域変換を活用することで、複雑な数学的演算を驚くべき速度と精度で実行できます。
実用的なアプリケーション
- 科学コンピューティング
- 財務計算
- 暗号
- 大規模数値シミュレーション
さらに読む
- Cooley-Tukey FFT アルゴリズム
- 整数論
- 計算数学
コード
完全な実装は次のとおりで、高速フーリエ変換アプローチを使用して大きな 10 進数を乗算するための堅牢なソリューションを提供します。
/** * Fast Fourier Transform (FFT) implementation for decimal multiplication * @param {number[]} a - Input array of real numbers * @param {boolean} invert - Whether to perform inverse FFT * @returns {Complex[]} - Transformed array of complex numbers */ class Complex { constructor(re = 0, im = 0) { this.re = re; this.im = im; } static add(a, b) { return new Complex(a.re + b.re, a.im + b.im); } static subtract(a, b) { return new Complex(a.re - b.re, a.im - b.im); } static multiply(a, b) { return new Complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re); } } function fft(a, invert = false) { let n = 1; while (n > 1; for (; j & bit; bit >>= 1) { j ^= bit; } j ^= bit; if (i > 1; for (let i = 0; i { const [intPart, decPart] = numStr.split("."); return { intPart: intPart || "0", decPart: decPart || "", totalDecimalPlaces: (decPart || "").length, }; }; const parsed1 = parseNumber(num1); const parsed2 = parseNumber(num2); // Combine numbers removing decimal point const combinedNum1 = parsed1.intPart + parsed1.decPart; const combinedNum2 = parsed2.intPart + parsed2.decPart; // Total decimal places const totalDecimalPlaces = parsed1.totalDecimalPlaces + parsed2.totalDecimalPlaces; // Convert to digit arrays (least significant first) const a = combinedNum1.split("").map(Number).reverse(); const b = combinedNum2.split("").map(Number).reverse(); // Determine result size and pad const resultSize = a.length + b.length; const fftSize = 1 new Complex(x, 0)); const complexB = b.map((x) => new Complex(x, 0)); // Perform FFT const fftA = fft(complexA); const fftB = fft(complexB); // Pointwise multiplication in frequency domain const fftProduct = new Array(fftSize); for (let i = 0; i = 10) { result[i + 1] += Math.floor(result[i] / 10); result[i] %= 10; } } // Remove leading zeros and convert to string while (result.length > 1 && result[result.length - 1] === 0) { result.pop(); } // Insert decimal point const resultStr = result.reverse().join(""); if (totalDecimalPlaces === 0) { return resultStr; } // Handle case where result might be shorter than decimal places if (resultStr.length <h3> 出力 </h3> <pre class="brush:php;toolbar:false">// Example Usage - Self verify using Python console.log( "Product of integers:", fftMultiply("12345678901234567890", "98765432109876543210") ); console.log("Product of decimals:", fftMultiply("123.456", "987.654")); console.log("Product of mixed decimals:", fftMultiply("12.34", "56.78")); console.log( "Product with different decimal places:", fftMultiply("1.23", "45.6789") ); console.log( "Product with large integers:", fftMultiply( "12345678901234567890786238746872364872364987293795843790587345", "9876543210987654321087634875782369487239874023894" ) ); const num1 = "1234567890123456789078623874687236487236498.7293795843790587345"; const num2 = "98765432109876543210876348757823694.87239874023894"; console.log("Product:", fftMultiply(num1, num2));
Product of integers: 1219326311370217952237463801111263526900 Product of decimals: 121931.812224 Product of mixed decimals: 700.6652 Product with different decimal places: 56.185047 Product with large integers: 121932631137021795232593613105722759976860134207381319681901040774443113318245930967231822167723255326824021430 Product: 121932631137021795232593613105722759976860134207381319681901040774443113318245.93096723182216772325532682402143
以上が高速フーリエ変換 (FFT) を使用した大きな 10 進数の乗算の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScriptコアデータ型は、ブラウザとnode.jsで一貫していますが、余分なタイプとは異なる方法で処理されます。 1)グローバルオブジェクトはブラウザのウィンドウであり、node.jsのグローバルです2)バイナリデータの処理に使用されるNode.jsの一意のバッファオブジェクト。 3)パフォーマンスと時間の処理にも違いがあり、環境に従ってコードを調整する必要があります。

javascriptusestwotypesofcomments:シングルライン(//)およびマルチライン(//)

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
