周期ゼミの周期が素数であることをシミュレート
セミは幼虫の期間が数年に及びます。
私が子供の頃は「セミは幼虫として7年間、土の中にいて、成虫になり1週間で死ぬ」と言われていました。
実際は、日本にいるセミは幼虫期間はもっと短く、成虫期間はもっと長いそうです。
世界にはきっちりした周期で発生するセミがいるそうです。
アメリカには13年周期のセミ、17年周期のセミがいて、今年はそれらの周期が221年ぶりに重なり、大量発生するのではないかと言われています。
本当に周期が素数になるのか、シミュレートしてみました。
周期が3年から20年までの周期ゼミがそれぞれ10000匹いたとします。
各年に発生したセミの合計50000匹を超えると割合に応じて50000匹まで減るものとします。
逆に50000匹未満であればそれぞれ1.2倍になるものとします。
これを99,999年繰り返します。
結果
コードは後述のとおりです。
結果は下のとおりです。
4年周期は周期が短いので減っても増えるので残りますがその他はすべて素数周期になります。
周期ゼミの周期は素数になると言えます。
[{'period': 3, 'value': 22050},
{'period': 4, 'value': 19998},
{'period': 5, 'value': 18502},
{'period': 6, 'value': 0},
{'period': 7, 'value': 32750},
{'period': 8, 'value': 0},
{'period': 9, 'value': 0},
{'period': 10, 'value': 0},
{'period': 11, 'value': 11336},
{'period': 12, 'value': 0},
{'period': 13, 'value': 11626},
{'period': 14, 'value': 0},
{'period': 15, 'value': 0},
{'period': 16, 'value': 0},
{'period': 17, 'value': 13262},
{'period': 18, 'value': 0},
{'period': 19, 'value': 18062},
{'period': 20, 'value': 0}]
{'period': 4, 'value': 19998},
{'period': 5, 'value': 18502},
{'period': 6, 'value': 0},
{'period': 7, 'value': 32750},
{'period': 8, 'value': 0},
{'period': 9, 'value': 0},
{'period': 10, 'value': 0},
{'period': 11, 'value': 11336},
{'period': 12, 'value': 0},
{'period': 13, 'value': 11626},
{'period': 14, 'value': 0},
{'period': 15, 'value': 0},
{'period': 16, 'value': 0},
{'period': 17, 'value': 13262},
{'period': 18, 'value': 0},
{'period': 19, 'value': 18062},
{'period': 20, 'value': 0}]
コード
import pprint
def main():
# 初期設定
value_limit = 50000
increase_rate = 1.2
sicadas = []
for year in range(3, 21):
sicadas.append({"period" : year, "value" : 10000})
# 年ごとの処理
for year in range(1, 100000):
total = 0
for sicada in sicadas:
if year % sicada["period"] == 0:
total += sicada["value"]
for i, sicada in enumerate(sicadas):
if year % sicada["period"] == 0:
if total > value_limit:
new_value = value_limit * sicadas[i]["value"] / total
sicadas[i]["value"] = int(new_value)
else:
new_value = sicadas[i]["value"] * increase_rate
sicadas[i]["value"] = int(new_value)
pprint.pprint(sicadas)
if __name__ == "__main__":
main()
def main():
# 初期設定
value_limit = 50000
increase_rate = 1.2
sicadas = []
for year in range(3, 21):
sicadas.append({"period" : year, "value" : 10000})
# 年ごとの処理
for year in range(1, 100000):
total = 0
for sicada in sicadas:
if year % sicada["period"] == 0:
total += sicada["value"]
for i, sicada in enumerate(sicadas):
if year % sicada["period"] == 0:
if total > value_limit:
new_value = value_limit * sicadas[i]["value"] / total
sicadas[i]["value"] = int(new_value)
else:
new_value = sicadas[i]["value"] * increase_rate
sicadas[i]["value"] = int(new_value)
pprint.pprint(sicadas)
if __name__ == "__main__":
main()
[ 2024年3月20日 | カテゴリー: 豆知識 | タグ: Python , セミ , 数学 , 素数 ]
« 「6174」って何だ? カプレカ数とは | アレサ・フランクリンの凄さを知る方法 »
コメントを残す