#環境
下記環境で確認
- 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