質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

1833閲覧

python3x: 素数を出す関数の構造を理解したい

hiro_weedslayer

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/02/11 19:02

わからないこと:
素数を出す以下のlambda関数を見かけたのだがイマイチ構造が理解できない。
素数2から30までの数字の入ったリストをなぜx==ix%iの二つ(しかもor)で仕分けする必要があるのかがわからない。

ソースコード:

nums = range(2,31) for i in range(2,8): nums = list(filter(lambda x: x == i or x % i, nums)) print(nums)

現時点での理解:

lambdaを使ってnumsの中の要素2~30それぞれを2から7の要素iを使って一個ずつ調べていく。lambda内の仕分けを除けばpythonの基本(for loop, range)の仕組みは分かっている。これはあまり効率的な方法ではないと聞いた。pythontutor.comで調べてもinfinite loopとして表示されてしまうため途中でプログラムが終わってしまっている。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

この処理は 2~7 で次々と割り算をして、すべてで割り切れないと素数と判断しています。
このとき、 x == i がないと、この x が取り除かれてしまいます。
(x == i の時は必ず割り切れるので)
x == i がない場合に for で毎回、nums を出してみると以下のようになります。

i
2 [3, 5, 7, 9,... ここで 2 が除かれている
3 [5, 7, 11, 13, 17, ... ここで 3 が除かれている
4 同上
5 [7, 11, 13, 17, 19, 23, 29] ここで 5 が除かれている
....

投稿2016/02/12 03:02

編集2016/02/12 03:03
yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問のコードは、「エラトステネスの篩(ふるい)」と呼ばれる素数を求める方法をプログラムにしたものだと思います。
エラトステネスの篩が、どのようにして素数を見つけていくのかは、Wikiのページにアニメーションがあります。
Wikipedia:エラトステネスの篩

順に並んでいる数字のリスト(num)から、ある数字(i)の倍数を除いていく(篩落としていく)訳ですから、
残るのは、i自身(x: x == i) か(or) iで割り切れない数(x: x % i)になる訳です。
これが、lambda関数の意味するところです。

<あまり効率的な方法ではない>
この方法の考案者とされるエラトステネスは2200年余り前のギリシャの学者ですから、計算機で効率的に実行する事など考えていなかったでしょうね。

投稿2016/02/12 02:58

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問