倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

PowerShell で素数を計算する

PowerShell 関連の記事が Pocket に保存されたままずっと眠っているので、軽くスクリプトを動かして読んだことにしよう企画。

今回は PowerShell で素数を計算するスクリプト。
PowerShell Examples: Calculating Prime Numbers - Jose Barreto's Blog - Site Home - TechNet Blogs
PowerShell で数学をガッツリ使うスクリプトをどの程度使うかは分からないけど、スクリプトの基本を見るにはちょうどいいかも。

Cls

Write-Host "Calculating prime numbers"
Write-Host ""

$count = 0
2..1000 | foreach{

  $number = $_
  $divisor = [math]::Sqrt($number)
  $prime = $true

  2..$divisor | foreach{
    if($number % $_ -eq 0){
      $prime = $false
    }
  }

  If($prime){
    Write-Host -NoNewline $number.ToString().PadLeft(4)
    $count++
    If($count % 10 -eq 0){
      Write-Host ""
    }
  }
}

Write-Host ""
Write-Host "$count primes between 2 and 1000"
Write-Host ""

スクリプト読解。 PowerShell 初心者なので、当たり前すぎることも書いてます。 数学に関することはあまり書きませんが*1

  • Cls」 : 表示をクリア
  • Write-Host」 : コンソールへ表示。
  • 「2..1000」 : ".." は範囲を生成する。 最近のプログラミング言語では範囲をサポートしてるのが多くて便利。 コードの少し後で「2..$divisor」として範囲を指定してるので境界の値は整数でなくても大丈夫なもよう
  • $_」 : パイプラインから流れてきて foreach 後のスクリプトブロックに渡される各オブジェクトが格納される変数。 foreach が入れ子になってると上書きされるので、外側の foreach のものは変数 $number に格納
  • [math]::Sqrt()」 : 数学関数を呼び出す、というか他のライブラリの関数を呼び出す接頭辞。 .NET フレームワークの関数とか呼べるのかな
  • $true」 : ブール値のリテラルは前に "$" が必要なのね。 忘れそう
  • -eq」 : PowerShell での同値関係、順序関係の評価は、コマンドラインのオプションみたく "-eq", "-le" などでするのね。
  • 「Write-Host -NoNewline」 : 改行せずにコンソールへ出力。 その後の少しのコードと併せて、1行に10個の素数を表示していく。 PadLeft() メソッドも使って綺麗に出力できるので、使えると便利そう。

スクリプトの実行結果はこんな感じ*2

Calculating prime numbers

   3   5   7  11  13  17  19  23  29  31
  37  41  43  47  53  59  61  67  71  73
  79  83  89  97 101 103 107 109 113 127
 131 137 139 149 151 157 163 167 173 179
 181 191 193 197 199 211 223 227 229 233
 239 241 251 257 263 269 271 277 281 283
 293 307 311 313 317 331 337 347 349 353
 359 367 373 379 383 389 397 401 409 419
 421 431 433 439 443 449 457 461 463 467
 479 487 491 499 503 509 521 523 541 547
 557 563 569 571 577 587 593 599 601 607
 613 617 619 631 641 643 647 653 659 661
 673 677 683 691 701 709 719 727 733 739
 743 751 757 761 769 773 787 797 809 811
 821 823 827 829 839 853 857 859 863 877
 881 883 887 907 911 919 929 937 941 947
 953 967 971 977 983 991 997
167 primes between 2 and 1000

Windows PowerShell超入門[4.0対応]

Windows PowerShell超入門[4.0対応]

【改訂新版】 Windows PowerShell ポケットリファレンス

【改訂新版】 Windows PowerShell ポケットリファレンス

*1:約数はその数の平方根より大きいものは(の数字以外に)ないので Sqrt() などを使ってる、とか。

*2:初めて PowerShell のスクリプトを実行する場合は、実行(セキュリティ)ポリシーを変更する必要があります。 管理者権限で PowerShell を起動し、「Set-ExecutionPolicy RemoteSigned」コマンドを実行してください。