LoginSignup
0
0

More than 5 years have passed since last update.

PowerShellで.NetのBigInteger型を使って巨大な整数を計算

Posted at

環境

下記環境で確認

  • Windows7 PowerShell 3.0 (.Net Framework 4.0以降が必要)
  • Windows10 PowerShell 5.1
  • Windows10 PowerShell 6.0

巨大な整数

Windowsに付属している電卓では、当たり前だが計算で扱える桁数に制限がある。
.Net Framework 4.0で追加されたBigIntegerをPowerShellで扱えるか確認した。

例) 階乗

100の階乗を計算するワンライナーを実行

> @(1..100)|% -Begin{$fact=[bigint]::One} -Process {$fact*=[bigint]::Parse($_)}
> $fact
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

とくに問題なく使えそうだ

説明

@(1..100)で階乗の値を指定する。パイプでforeachに渡して$factをBigIntegerの1で初期化。(PowerShellで[bigint]型として使える)
あとは乗算*=を階乗の回数だけ繰り返す。普通の数値型や文字列等からはParseメソッドで変換してやる。

注意点

階乗の計算は昔からCPUを食う(実行時間がかかる)ことで知られている。大きな階乗を計算するとものすごく時間がかかるので注意。
試しに100万の階乗を計算したら18分かかった。。。(Win10、Core i5-4570 CPU @3.20GHzのマシン)
CPUの高負荷テストに使えるかも。

> Measure-Command{@(1..1000000)|% -Begin{$fact=[bigint]::One} -Process {$fact*=[bigint]::Parse($_)}}


Days              : 0
Hours             : 0
Minutes           : 18
Seconds           : 42
Milliseconds      : 228
Ticks             : 11222287421
TotalDays         : 0.0129887585891204
TotalHours        : 0.311730206138889
TotalMinutes      : 18.7038123683333
TotalSeconds      : 1122.2287421
TotalMilliseconds : 1122228.7421
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0