検索
ホームページウェブフロントエンドjsチュートリアル高速フーリエ変換 (FFT) を使用した大きな 10 進数の乗算

Multiplying Large Decimal Numbers Using Fast Fourier Transform (FFT)

導入

大きな 10 進数の乗算は、特に桁数や小数点以下の桁数が多い数値を扱う場合、計算が困難になることがあります。従来の乗算方法は、数値が非常に大きい場合には非効率的になります。ここで高速フーリエ変換 (FFT) が役に立ち、大きな数を驚異的な速度で乗算するための強力かつ効率的なアルゴリズムを提供します。

掛け算への応用

  • FFT は、数値を周波数領域に変換し、点単位の乗算を実行してから逆 FFT を適用することにより、多項式または大きな整数の高速乗算を可能にします。

大きな数の掛け算への挑戦

従来の乗算方法の時間計算量は O(n²) (n は桁数) です。非常に大きな数の場合、計算コストが高くなります。 FFT ベースの乗算アルゴリズムは、この複雑さを O(n log n) に軽減し、大きな数に対して大幅に高速化します。

Cooley-Tukey FFT の証明の概要

  1. 離散フーリエ変換 (DFT) の分解:

    • DFT は次のように定義されます。
      Xk=n=0N1 xne2π ikn/N,X_k = sum_{n=0}^{N-1} x_n cdot e^{-2pi i cdot kn / N}, Xk = n=0N−1 xne−2πi⋅kn /N
      どこ NN N は入力信号のサイズです。
    • Cooley-Tukey FFT は、計算をより小さなサイズの DFT に分割します。 N/2N/2 N/2 偶数インデックスの用語と奇数インデックスの用語を分けることにより、次のようになります。
      Xk=n=0N/2 1x2ne2πi (2n )k/N n=0N / 21x2 n 1e2 πi(2n 1)k/N.X_k = sum_{n=0}^{N/2-1} x_{2n} cdot e^{-2pi i cdot (2n)k / N} sum_{n=0}^{N/2-1} x_{2n 1} cdot e^{-2pi i cdot (2n 1)k / N}。 Xk = n=0N/2−1 x2n e −2πi⋅(2n)k/N n=0N/ 2−1x2n 1e−2πi⋅(2n 1)k/N.
    • これは次のようになります。
      Xk=偶数項の DFT Wk奇数項の DFT X_k = text{偶数項の DFT} W_k cdotテキスト{奇数項の DFT}、 Xk =偶数項の DFT Wk奇数項の DFT
      どこ Wk=e2πik/N W_k = e^{-2pi i cdot k / N} Wk =e−2πi ⋅k/N .
  2. 再帰構造:

    • サイズの各 DFT NN N サイズが異なる 2 つの DFT に分割されます。 N/2N/2 N/2 、再帰的な構造につながります。
    • この再帰的な除算は、サイズの基本ケースが得られるまで継続されます。 N=1N = 1 N=1 この時点では、DFT は単なる入力値です。
  3. バタフライオペレーション:

    • アルゴリズムは、バタフライ演算を使用して、より小さな DFT からの結果をマージします。
      a'=u Wkv b'=uWkv,a' = u W_k cdot v、クワッド b' = u - W_k cdot v、 a'=u Wkv,b' =u−Wkv,
      どこ uu u そして vv v はより小さな DFT の結果であり、 WkW_k Wk 団結の根源を表します。
  4. ビット反転順列:

    • 入力配列は、インプレース計算を可能にするために、インデックスのバイナリ表現に基づいて並べ替えられます。
  5. 時間計算量:

    • 再帰の各レベルには、 NN N 単一根を含む計算、再帰の深さは次のとおりです。 ログ2(N)log_2(N) log2 (N) .
    • これにより、時間計算量は次のようになります。 O(N ログN)O(N log N) O(NlogN) .

逆FFT

  • 逆 FFT は似ていますが、以下を使用します。 e2πi kn/Ne^{2pi私は知りません / N} e 2πi⋅kn/N を基準として結果をスケールします 1/N1/N 1/N .

FFT乗算アルゴリズムを理解する

FFT 乗算アルゴリズムは、いくつかの重要なステップを通じて機能します。

  1. 数値の前処理

    • 入力数値を数字の配列に変換します
    • 整数部分と小数部分の両方を処理します
    • FFT 計算のために配列を最も近い 2 のべき乗にパディングします
  2. 高速フーリエ変換

    • FFT を使用して数値配列を周波数領域に変換します
    • これにより、乗算の問題が周波数領域でのより単純な点ごとの乗算に変換されます
  3. 周波数領域の乗算

    • 変換された配列の要素ごとの乗算を実行します
    • 効率的な計算のために複素数演算を利用する
  4. 逆 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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?May 14, 2025 am 12:15 AM

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

JavaScriptコメント://および / * *を使用するためのガイドJavaScriptコメント://および / * *を使用するためのガイドMay 13, 2025 pm 03:49 PM

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

Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

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

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

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

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

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

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

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

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

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

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

DVWA

DVWA

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