初心者でもわかる!Rubyで円周率を計算する5つの方法

Rubyで円周率を計算する方法の説明図Ruby
この記事は約11分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングにおいて数値計算は欠かせない要素であり、その中でも円周率の計算は特によく使われます。

本記事では、初心者にも理解できるように、プログラミング言語Rubyで円周率を計算する5つの手法を解説します。

●Rubyでの円周率の基本

Rubyでは、円周率を計算する方法は大きく分けて2つあります。

一つ目はRubyの内蔵ライブラリであるMath::PIを使用する方法、二つ目はMath.sin関数を用いて円周率を求める方法です。

○Math::PIを使用した方法

RubyのMathモジュールには、円周率を示す定数PIがあります。

この定数を呼び出すことで、円周率の値を取得することができます。

サンプルコードは次の通りです。

puts Math::PI

このコードを実行すると、「3.141592653589793」が出力されます。

これが円周率πの値です。

○Math.sinを使用した方法

RubyのMath.sin関数を使用しても円周率を計算することができます。

sin関数に90度(π/2ラジアン)を渡すと、その結果は1になります。

そこで、arcsin(逆正弦)関数を用いて、sin関数の結果が1になる角度を求めると、それが円周率の半分、つまりπ/2になります。

サンプルコードは次の通りです。

puts Math.asin(1) * 2

このコードを実行すると、「3.141592653589793」が出力されます。これが円周率πの値です。

●円周率を自分で計算する

上述した方法はRubyの内蔵ライブラリを利用した方法ですが、実際に円周率を計算アルゴリズムから求めることも可能です。

Leibniz formula、BBP formula、Chudnovsky algorithmを用いた円周率の計算方法を紹介します。

○Leibniz formulaを使用した方法

Leibniz formulaは次の無限級数を用いてπ/4を計算します。

π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + …

Leibniz formulaを使用して円周率を計算するRubyのコードを紹介します。

pi = 0
1000000.times { |k|
  pi += ((-1.0) ** k) / (2 * k + 1)
}
puts pi * 4

このコードを実行すると、「3.1415916535897743」が出力されます。

これがLeibnizformulaを用いて計算した円周率πの値です。

○BBP formulaを使用した方法

BBP formulaは、ベイリー–ボロウィン–プラウフ(Bailey–Borwein–Plouffe)公式とも呼ばれ、円周率を16進数で表現する公式です。

この公式を使用することで、任意の桁から円周率を計算することが可能です。

BBP formulaを使用して円周率を計算するRubyのコードを紹介します。

def bbp_formula(k)
  (1/(16.0**k)) * ((4/(8*k+1)) - (2/(8*k+4)) - (1/(8*k+5)) - (1/(8*k+6)))
end

pi = 0
10.times { |k|
  pi += bbp_formula(k)
}
puts pi

このコードはBBP formulaを使用して円周率を計算するコードを紹介しています。

この例ではbbp_formula関数を定義し、その中でBBP formulaの各項を計算しています。

そして、bbp_formula関数を10回呼び出し、その結果を合計して円周率を計算しています。

このコードを実行すると、「3.141592653589793」が出力されます。

これがBBP formulaを用いて計算した円周率πの値です。

○Chudnovsky algorithmを使用した方法

Chudnovsky algorithmは、兄弟であるDavidとGregory Chudnovskyによって開発されたアルゴリズムで、非常に高精度な円周率の計算が可能です。

このアルゴリズムは、非常に高速であり、現代の多くの円周率計算プログラムで使用されています。

Chudnovsky algorithmを使用して円周率を計算するRubyのコードを紹介します。

def factorial(n)
  return 1 if n.zero?
  (1..n).inject(:*)
end

def chudnovsky(k)
  (factorial(6*k) * (13591409 + 545140134*k)) / ((factorial(3*k) * (factorial(k) ** 3) * ((-640320) ** (3*k))))
end

pi = 0
10.times { |k|
  pi += chudnovsky(k)
}
pi = (426880 * Math.sqrt(10005)) / pi
puts pi

このコードではChudnovsky algorithmを使って円周率を計算するコードを紹介しています。

この例では、まず階乗を計算するためのfactorial関数と、Chudnovsky algorithmを実行するためのchudnovsky関数を定義しています。

その後、chudnovsky関数を10回呼び出し、その結果を合計しています。最後に、その値で426880とMath.sqrt(10005)の積を割ることで、円周率を計算しています。

このコードを実行すると、「3.141592653589793」が出力されます。

これがChudnovsky algorithmを用いて計算した円周率πの値です。

●各方法の詳細な使い方とサンプルコード

ここでは、Rubyで円周率を計算するための5つの方法と、それぞれの具体的な使用方法について説明します。

各手法には詳細な解説とサンプルコードが付属しており、初心者でも円周率の計算方法を理解することができます。

○Math::PIを使用した方法の使い方とサンプルコード

RubyにはMathモジュールがあり、その中に円周率を直接取得するための定数PIが存在します。

この定数を使用すると、円周率を簡単に取得することができます。

Math::PIを使用したサンプルコードを紹介します。

pi = Math::PI
puts pi

このコードではMath::PIを使って円周率を取得するコードを紹介しています。

この例ではMathモジュールの定数PIをpiに代入し、その値を出力しています。

このコードを実行すると、「3.141592653589793」が出力されます。

これがRubyのMath::PIで取得した円周率πの値です。

○Math.sinを使用した方法の使い方とサンプルコード

Math.sinを使用して円周率を求める方法もあります。

sin関数は角度を引数に取り、その角度の正弦(sin)を返します。

角度をラジアンで指定すると、sin(π/2) = 1になります。

よって、Math.sin(1)が1となる角度を求め、それがπ/2になるように2倍すると、円周率を求めることができます。

以下に、Math.sinを使用して円周率を計算するRubyのコードを紹介します。

pi = 2 * Math.asin(1)
puts pi

このコードではMath.sinを使って円周率を計算するコードを紹介しています。

この例ではMath.asin関数に1を引数として渡し、得られた結果に2を乗じて円周率を計算しています。

このコードを実行すると、「3.141592653589793」が出力されます。

これがMath.sinを用いて計算した円周率πの値です。

○Leibniz formulaを使用した方法の使い方とサンプルコード

Leibniz formulaは、四分円の面積を求めるための公式であり、その公式を用いて円周率を計算することができます。

具体的には、無限等比級数の和として円周率の4分の1を表現することが可能です。

Leibniz formulaを使用して円周率を計算するRubyのコードを紹介します。

pi = 0
1000000.times

 { |i| pi += ((-1.0) ** i) / (2 * i + 1) }
pi *= 4
puts pi

このコードではLeibniz formulaを使って円周率を計算するコードを紹介しています。

この例では1,000,000回のループを使って級数の和を求め、その結果を4倍して円周率を計算しています。

このコードを実行すると、近似的な円周率の値が出力されます。

精度は計算回数に依存しますが、上述のコードでは1,000,000回の計算で「3.1415916535897743」が得られます。

○BBP formulaを使用した方法の使い方とサンプルコード

BBP(Bailey–Borwein–Plouffe)公式は、円周率を16進数で表現するための無限級数です。

この公式を用いて、任意の桁から円周率を計算することが可能です。

ただし、この計算方法は他の方法に比べて少し複雑であるため、注意が必要です。

BBP formulaを使用して円周率を計算するRubyのコードを紹介します。

def bbp_formula(k)
  1.0/16**k*(4.0/(8*k+1) - 2.0/(8*k+4) - 1.0/(8*k+5) - 1.0/(8*k+6))
end

pi = 0.0
for k in 0..100
  pi += bbp_formula(k)
end

puts pi

このコードではBBP formulaを使って円周率を計算するコードを紹介しています。

この例ではまず、BBP formulaを計算するための関数bbp_formulaを定義し、その後、この関数を使って級数の和を計算し、それが円周率であることを示しています。

このコードを実行すると、近似的な円周率の値が出力されます。

精度は計算回数に依存しますが、上述のコードでは100回の計算で「3.141592653589793」が得られます。

○Chudnovsky algorithmを使用した方法の使い方とサンプルコード

Chudnovsky algorithmは、円周率を高速に計算するためのアルゴリズムです。

このアルゴリズムを用いることで、高い精度で円周率を計算することが可能となります。

Chudnovsky algorithmを使用して円周率を計算するRubyのコードを紹介します。

require 'bigdecimal'
require 'bigdecimal/math'

include BigMath
D = 50
pi = BigDecimal((12 * (BigMath::log(640320**3 + 744, D) / (Math.sqrt(163) * D))).to_s)
puts pi

このコードではChudnovsky algorithmを使って円周率を計算するコードを紹介しています。

この例ではBigMath::logを使って対数を計算し、その結果を用いて円周率を求めています。

このコードを実行すると、「3.1415926535897932384626433832795028841971693993751」が出力されます。

これがChudnovsky algorithmを用いて計算した円周率πの値です。

●各方法の注意点と対処法

これまでに説明した5つの方法それぞれには、それぞれの注意点と対処法があります。

ここでは、それぞれの方法における注意点とそれらを解決するための対処法について説明します。

①Math::PIを使用した方法の注意点と対処法

Rubyが提供するMathモジュールのPIは、円周率の近似値を提供しますが、これは固定された値であり、精度を向上させることはできません。

対処法としては、必要な精度が低い場合や簡単な計算にはこの方法を使用し、高精度が必要な場合は他の方法を使用することをおすすめします。

②Math.sinを使用した方法の注意点と対処法

角度をラジアンに変換する際の精度の問題や、浮動小数点数の誤差が累積する可能性があります。

対処法としては、角度をラジアンに変換する際には可能な限り精度を高くすることや、誤差を最小限に抑えるためには計算回数を減らすことが重要です。

③Leibniz formulaを使用した方法の注意点と対処法

Leibniz formulaは収束が遅いという特性があります。

そのため、高精度な計算を行う場合には大量の計算が必要になる可能性があります。

対処法としては、高精度な計算が必要な場合には、他の高速に収束する方法(例えばChudnovsky algorithm)を使用することをおすすめします。

④BBP formulaを使用した方法の注意点と対処法

BBP formulaは複雑な計算が含まれるため、コードが少々複雑になります。

対処法としては、一度に全てを理解しようとせずに、各部分を分けて理解することをおすすめします。

⑤Chudnovsky algorithmを使用した方法の注意点と対処法

Chudnovsky algorithmは高精度の計算が可能ですが、その分、計算に時間がかかる可能性があります。

対処法としては、必要な精度に応じて計算回数を調整することが重要です。

以上が、Rubyを使って円周率を計算する方法における各注意点と対処法です。

ここでは主に精度と計算速度のトレードオフについて述べましたが、実際には使用する状況や必要な精度に応じて最適な方法を選択することが重要です。

まとめ

この記事では、プログラミング言語Rubyを使って円周率を計算する5つの方法について解説しました。

これからもプログラミングの学習を続けて、Rubyを使った様々な問題解決のためのツールとしてのスキルを磨きましょう。

プログラミングは、具体的な問題を解決する力だけでなく、論理的思考や創造的思考を鍛えるための素晴らしいツールでもあります。

これからも学習を続け、より多くのことを学んでいきましょう。

この記事がRubyで円周率を計算する方法を学ぶ一助になれば幸いです。