素数プログラム

1 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:20:57.798 ID:JIX5od2P0
これ↓も結構いいアルゴだと思ったんだけどエラトステネスの篩には敵わんか?

def sosulist(m):
  def sosulist_(n,ls):
    if n>=m:
      return ls
    else:
      for p in ls:
        if not n%p:
          break
      else:
        ls.append(n)
      return sosulist_(n+1)
  return sosulist_(2,[])

2 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:22:30.117 ID:58IUIhRh0
そこそこの精度だけど
エラトステネスのふるいよりも速い
アルゴリズムあるよね
3 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:23:38.685 ID:JIX5od2P0
そうなのか
そこら辺詳しくないわ
4 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:24:59.585 ID:58IUIhRh0
高校数学の美しい物語でも紹介されてた気がする
5 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:26:30.525 ID:JIX5od2P0
それなら読んだことあるかも知れない
まぁ俺はそんなに大きい素数は必要ないしな…
20 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:13:08.409 ID:58IUIhRh0
>>5
サイトの方な
21 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:16:28.284 ID:JIX5od2P0
>>20
俺はサイトしか見てないから恐らく大丈夫だ
6 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:27:35.887 ID:BgenxLJc0
そのプログラムもエラトステネスのふるいになってない?
平方根までのチェックのが早いだろうけど
7 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:32:54.736 ID:JIX5od2P0
>>6
そうなのかな?
素数のリストを作っていって、今まで出た素数で割れないものを新たに素数リストに加えるって感じだけど
エラトステネスの篩はとにかく倍数を消してく感じだよね
8 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:46:28.579 ID:iRvq4w8N0
>>7
「消す」の代わりに「わざわざ毎回計算する」ってだけで、やってることは同じだろ
9 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:48:11.179 ID:JIX5od2P0
そうだろうか…
計算量は同じ?
10 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:50:54.058 ID:iRvq4w8N0
計算量自体は同じじゃね?
ただし、エラトステネスは目標となる数までのテーブルを一気に確保するのに対して、
>>1の場合は動的確保により要素数を増やし続けるから、
その分のコストが差として出る
11 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:52:18.932 ID:BgenxLJc0
計算量は同じO(n^2)だと思う
ミラーラビンは
確率4の-k乗の精度でO(k*log3 n)らしい
12 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:55:44.968 ID:JIX5od2P0
ふむ…そうかも
調べたらエラトステネスの篩の計算量はO(nloglogn)らしい
>>1も同じかなぁ
13 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 17:59:53.693 ID:BgenxLJc0
素数の頻度はloglognに近似するのか
14 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:01:54.324 ID:JIX5od2P0
https://mathtrain.jp/eratosthenes

これを読む限り、mまでの素数を求める計算量は

エラトステネス=Σ[p<√m](m/p)
>>1=Σ[k=2,m]Σ[p<√k]1

という感じだな

15 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:02:44.692 ID:JIX5od2P0
>>1ではルート使ってなかったけど使ったものと想定してくれ
16 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:04:49.203 ID:BgenxLJc0
ああ頻度が近似するんじゃなくてルート使うからかそうだな
17 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:08:25.864 ID:mZ33aBbi0
割り算自体は掛け算より遅いし
ループ上限は平方根で十分

エラトステネスの方が速いだろうな

18 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:08:31.737 ID:JIX5od2P0
うむ
19 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:11:17.237 ID:JIX5od2P0
「素数定理」によればn以下の素数の個数はn/lognで近似できるらしいから

>>1の計算量
=Σ[k=2,m]Σ[p<√k]1
=Σ[k=2,m]2√k/logk
=

わからん

22 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:16:47.280 ID:JIX5od2P0
まぁいいや
お前ら付き合ってくれてありがと
23 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:19:47.335 ID:mZ33aBbi0
動的に上限を増やすなら
回転ふるいを応用すれば
それなりの速度を保ちつつメモリ使用量を抑えられるかもね

確定探索の話ね。
勿論確率的探索なら話は違う

24 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:21:36.601 ID:JIX5od2P0
よく分からんけどthx
26 名前:ひみつの名無しさん 投稿日時:2020/10/27(火) 18:43:09.869 ID:JIX5od2P0
なるほど、分かりやすい

コメント

タイトルとURLをコピーしました