0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2つの自然数が互いに素である確率にπが出てくる不思議【Pythonで実験してみた】

Last updated at Posted at 2025-03-25

記事の内容

今回の記事では、数学的にも、プログラミング的にも、とても興味深いテーマを紹介します。

2つの自然数が互いに素である確率、という問題です。

そして、その答えは、

\dfrac{6}{\pi ^{2}}

であるというものです。

自然数が絡む確率の話なのに、なぜか円周率が出てくるのです!!

不思議ですよね。

この記事では、数学的な話とプログラムを使った話で、この問題を解説します。

問題のイメージ

もう少し説明しましょう。

自然数は無限にあります。その中から無作為に一つの自然数を選びます。続けて、重複を許しつつもう一度、自然数を無作為に選びます。

このとき選ばれた2つの自然数が互いに素である確率を考えるのです。

この答えに円周率である $ \pi $ が登場することが不思議に見えます。

くわえて、無限は厄介です。無限があるせいでイメージしづらくなります。

具体的に考えてみましょう。

範囲を100までの自然数とします。

この範囲で自然数を一つ選ぶ。さらに、もう一回選ぶ。

5と19が選ばれたとします。このとき、この2つの自然数が互いに素になるかどうかを考えるのです。

5と19なら、互いに素です。
21と63なら、互いに素ではありません。
68と7なら、互いに素です。

このように試行を繰り返せば、そこには確率を考えることができます。

少しはイメージがわいてきたでしょうか?

引用元 

この問題は、数学youtuberの鈴木貫太郎さんの動画から引用しています。
おそらく、もともと有名な問題なのではないでしょうか。

2つの自然数が互いに素ある確率。6/πの2乗

いったいどこから円周率が出てくるのか?

もう少し数学的な話に入っていきましょう。

どこから $ \pi$ が出てくるのか?
この謎の答えは、「自然数の平方の逆数の和」のせいです。

あの天才オイラーが解決した問題です。
オイラーは次の数式を導きました。

\dfrac{1}{1^{2}}+\dfrac{1}{2^{2}}+\dfrac{1}{3^{2}}+\dfrac{1}{4^{2}}+\ldots =\dfrac{\pi ^{2}}{6}

この数式を導く過程で、「自然数の平方の逆数の和」を考えるために、三角関数を使って近似しているのです。三角関数を利用しているのならば、円周率である$ \pi$が登場するのも自然です。

詳しい証明は、鈴木貫太郎さんの動画をご覧ください。どのように三角関数を利用しているのか、ぜひチェックを。

そして、2つの自然数が互いに素である確率を求めようとすると、「自然数の平方の逆数の和」が式に現れてくるのです。上記のオイラーの式と繋がります。

プログラム使えば実験できるのでは!!

ここで一つ思いついたことがあります。

確率の話なのだから、実際に繰り返し試してみればいい。

実験すれば、数式の結果を確かめられるはずです。

コンピュータに繰り返し試行させることで、実際に確率を求めてみましょう!

今回はpythonで実装してみました。

ポイントは互いに素であるかどうかの判定です。これは、互いに1以外の公約数を持たなければいいのです。

2つの数を与えると最大公約数を返してくれる関数を考えます。このとき最大公約数が1ならば、互いに素であると判定できます。最大公約数を求めるアルゴリズムといえば、ユークリッドの互除法です。

ユークリッドの互除法では、以下の手順で最大公約数を求めます。

import math # 円周率をつかうため
import random

def gcd(a, b):
    """
    2つの整数 a, b の最大公約数 (GCD) をユークリッドの互除法で求める関数

    :param a: 整数
    :param b: 整数
    :return: a と b の最大公約数
    """
    while b != 0:  # b が 0 になるまで繰り返す
        a, b = b, a % b  # a を b に、b を a を b で割った余りに更新する
    return a  # b が 0 になったときの a が最大公約数

s = 0
num = 1

while num <= 10000000:
  a = random.randint(1,10000000)
  b = random.randint(1,10000000)
  if gcd(a,b) == 1: # 最大公約数が1のとき互いに素であると判定
    s += 1
  num += 1


print(s / num) # 実験値
print(6 / math.pi**2) # 理論値

今回は、1~10000000の中から自然数を選びます。
そして、10000000試行です。

その結果は、次のようになりました。
上が実験で求めた値、下が理論的に求めた値です。
かなり近い値になっていることがわかるとおもいます。この結果には驚きです。数学という理論の強さを目の当たりにした気分です。そして、プログラムをとおしてコンピュータを利用することの面白さも改めて確認できました。

0.607662239233776
0.6079271018540267

皆さんの環境でもぜひ試してみてください。

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?