周期ゼミの周期が素数であることをシミュレート

Pocket

セミは幼虫の期間が数年に及びます。
私が子供の頃は「セミは幼虫として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}]

コード

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()

[ 2024年3月20日 | カテゴリー: 豆知識 | タグ: , , , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報