
[python] 準備編 01 : 素数をテーマにプログラミングを楽しく学びます。
概要 素数はおもしろい性質をもっています。素数をテーマにプログラミングを楽しく学んでいきましょう。
プログラミング
コンピュータはわたしたちの作業をわたしたちのかわりにしてくれます。その作業をする手順を書くことをプログラミングといいます。
そして,その手順を書いたものをコードといいます。例えるならば,「料理のレシピ」や「プラモデルの組み立て説明書」のようなものです。レシピや組み立て説明書どおりに,わたしたちは作業を進めます。コンピュータに対して,してほしい作業の手順を書いたものをコードといいます。
そのコードは,コンピュータが理解できる言葉で書かれている必要があります。世界には日本語だったり,英語だったり,ロシア語だったりいろいろな言葉があります。コンピュータが理解できる言葉にもいろいろあります。Ruby だったり,Java だったり,Python だったり。この一連の記事では,Python を使ったプログラミングについて学んでいきます。
プログラミングとは,コンピュータにしてほしい作業の手順を書くことをいいますが,してほしい作業をしてもらうためには,その作業の内容が十分に整理できていなければなりません。
してほしい作業を整理する
それではコンピュータにしてほしい作業として,次の例を考えてみましょう。
ある数が素数かどうかを判定する。
コンピュータにこの作業をしてもらうためには,まず,わたしたち自身が素数を判定するという作業をよく整理できていなければなりません。
素数とは,1より大きい自然数で,1とその数自身以外に約数を持たない数のことです。ここで「自然数」や「約数」という言葉がでてきました。どういう意味か確認してから次に進みましょう。
確認
整数とは以下の数を合わせた数をいいます。
1, 2, 3,... と無限につづく数
0
-1, -2, -3,... と無限につづく数
このうち,1, 2, 3,... のように物を数えるときに使う数のことを自然数といいます。
約数とは,ある整数を割り切ることができる整数のことをいいます。例えば,1 は 1 で割り切れます。ですから 1 は 1 の約数です。2 は 1 と 2 で割り切れます。ですから,1 と 2 は 2 の約数です。
素数の判定
さて,素数の判定の方法を整理しましょう。
素数は「1より大きい自然数」ですから,2, 3, 4,... である数です。つまり,2以上の自然数です。
素数は1とその数自身だけで割り切れる数です。つまり、約数は必ず2つになります。
整理すると以下のとおりです。
素数とは2以上の自然数
素数とは約数が2個だけ
約数を調べる
ある数の約数を調べるにはどうしたらいいでしょう。
例えば,10の約数を調べるには、1から10までのすべての数で割ってみて、余りが0になるものを探します。
10 は 1 で割り切れるか。割り切れる。1 は 10 の約数である。
10 は 2 で割り切れるか。割り切れる。2 は 10 の約数である。
10 は 3 で割り切れるか。割り切れない。3 は 10 の約数ではない。
10 は 4 で割り切れるか。割り切れない。4 は 10 の約数ではない。
10 は 5 で割り切れるか。割り切れる。5 は 10 の約数である。
10 は 6 で割り切れるか。割り切れない。6 は 10 の約数ではない。
10 は 7 で割り切れるか。割り切れない。7 は 10 の約数ではない。
10 は 8 で割り切れるか。割り切れない。8 は 10 の約数ではない。
10 は 9 で割り切れるか。割り切れない。9 は 10 の約数ではない。
10 は 10 で割り切れるか。割り切れる。10 は 10 の約数である。
すでに整理したように素数の約数は2個しかありません。今回の10について言えば,約数は3個ありました。ですから,10 は素数でないと判定されます。
素数の判定はこのようにすればいいことがわかりました。判定作業を十分に整理できたので,整理した内容をコードにしていきましょう。
コードを書く
これまでは人間が自分の頭で計算していましたが,これからは python を使って計算することにします。
ターミナルを起動し,python3 とタイプし,Enter キーを押します。
Python 3.13.1 (main, Dec 3 2024, 17:59:52) [Clang 15.0.0 (clang-1500.1.0.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
インタラクティブモードといい,1行づつコードを入力して実行する方法を使ってコードの書き方を学んでいきましょう。
それでは $${10 \div 1}$$ を計算しましょう。>>> をプロンプトといいますが,このプロンプトの横に,次のようにタイプしましょう。これは$${10 \div 1}$$という意味です。Python では割り算をスラッシュで表現します。
10 / 1
Enter キーを押します。10と表示されたでしょう。正しいですね。
しかし,わたしたちの知りたいことは,割り切れるかどうかでした。割り切れるとは,余りがゼロであることをいいます。10 を 1 で割ったとき,余りがゼロかどうかを尋ねてみましょう。次のようにタイプし,Enter キーを押します。
10 % 1
このコードは10を1で割った時の余りを出力しています。0 と表示されているでしょう。
余りがゼロかどうかを知りたい場合は次のようにタイプし,Enter キーを押します。
10 % 1 == 0
これは == の左辺の値と右辺の値が同じかどうかを判定しています。同じであれば,True を,ちがっていれば,False を返します。True が返されたことでしょう。True は真,False は偽という意味です。
このようにしてコンピュータにしてほしいことを伝えて結果を得るのがプログラミングです。その伝えたいことを書いたものがコードです。
さて,10 の約数を調べるには,10 を1で割った余りがゼロか,2で割った余りがゼロか,3で割った余りがゼロかと 10 回判定する必要があります。
10回くらいならいいですが,1000の約数を調べる場合にはこの方法では1000回繰り返さなければなりません。
for 文
安心してください。繰り返しは次のように表現できます。タイプしてみましょう。
for i in range(10):
print(i)
Enter キーを押しましょう。0 から 9 までの数が表示されました。これを for 文といいます。
for 文は次の構造をしています。
for 変数 in イテラブルオブジェクト:
処理
イテラブルオブジェクトとは,繰り返しの対象です。この場合,range(10) がイテラブルオブジェクトです。
range() は python の関数です。カッコのなかに指定した数だけ,0 から始まる整数のシーケンス (sequence) を作り出します。具体的には $${0, 1, 2, 3, 4, 5, 6, 7, 8, 9,}$$ です。for 文では,まず最初の要素 0 を取り出し,変数 i に代入して,次の行の処理を行います。
変数 i というのは,今回,for i in range(10): とある,for の次の i のことです。変数は数値や文字列などを入れておく箱のようなものです。中学校以降の数学でいう変数と同じです。変数の名前は自由につけることができます。今回は i としていますが,j でも構いませんし,index としても構いません。
処理の部分に print() があります。これも python の関数です。カッコのなかの数値や文字列を標準出力に書き出します。この場合,変数 i がカッコのなかにあります。最初 0 から始まって,1, 2, 3, とイテラブルオブジェクトの要素が取り出され,変数 i に代入されます。そうして print() で出力しているわけです。
私たちのしたいことは,10 を 1 から 10 までの数で割って余りがゼロになるかを見ることにあります。どう書けばいいでしょう。まずは 0 から 9 までの数を表示させるのではなくて,1 から 10 までの数を表示させてみましょう。
for i in range(10):
print( i+1)
1 から 10 までの数が表示されたことでしょう。print() のなかに i+1 と書いています。これは 変数 i の値に1を足せという意味です。
これで 1 から 10 の数を使う準備ができました。次は 10 を 1 から 10 の数で割って余りがゼロになるかみてみましょう。
for i in range(10):
10 % (i+1) == 0
これを実行すると,True や False の列が表示されたことでしょう。1番目,2番目,5番目,10番目が True となっています。これは 1, 2, 5, 10 で割ったときに余りがゼロになるということです。
さて私たちが知りたいのは,10が素数かどうかです。それは約数が2個かどうかで判断できます。10回余りを求めていますが,True になる回数が2回だったら,10は素数だということです。
変数 n を設けて,その数を 0 に設定しておきます。
10回処理を繰り返します。
もしも,10を変数 i で割った余りがゼロだったら,変数 n に 1 を加えます。
10回処理を繰り返したのち,もしも,変数 n の値が 2 だったら,10 は素数だということになります。 このとき,print() を使って,標準出力に「Prime number!」と出してみましょう。Prime number は素数という意味です。
if 文
「もしも」は if 文で表現できます。
if 条件式:
処理1
else:
処理2
条件とは,「10を変数 i で割った余りがゼロ」だったり,「変数 n の値が 2」だったりする場合のことです。そのときに前者の場合であれば,変数 n に1を加える処理をし,後者の場合は 10 は素数だというメッセージを出す処理をします。
条件に合わない場合は,else: 以下の処理を行います。
n = 0 # 変数nを0で初期化
for i in range(10): # 0から9までの10回繰り返し処理
if 10 % (i + 1) == 0: # 10をi+1で割った余りが0の場合
n += 1 # nに1を加える
if n == 2: # nが2の場合
print("Prime number!") # 素数と表示
else: # nが2でない場合
print("Not prime number.") # 素数でないと表示
一番最初の行,n=0 です。変数 n に 0 を代入しています。
次の for 文ですが,10 を 1 で割って余りがゼロになるか,2で割って余りがゼロになるか,3で割って余りがゼロになるかと10回繰り返しています。もしも,条件を満たせば,次の処理をしています。
n += 1
これは次のコードと同じ意味です。
n = n + 1
ここでのイコール (=) は数学でいうイコールはありません。数学ではイコールは左の辺と右の辺の値が同じことを意味します。Python ではちがいます。右にある値を,左の変数に代入するという意味でイコールが使われています。n = n+1 というのは n+1 の値を変数 n に代入するという意味です。n の値をひとつプラスするという意味です。
n += 1 というのは,n = n+1 の短縮形で,意味は n = n+1 と同じです。
さて,これで 10 が素数であるか判定するコードを書くことができました。しかし,わたしたちの課題は次のような課題でした。
ある数が素数かどうかを判定する。
10 だけ素数かどうか判定するのではなく,ある数,つまり任意の数の素数判定ができなければなりません。それについて次回取り組んでみましょう。
関連する記事
以前作ったパズルゲームです。面白いと思います。
解ける?Python with Pyxel でパズルゲームを作りました。[note]
およそ1年前ピンポンを作ろうと思ってそのままになっていました。また続きを書いてみたいです。
ピンポンを Python with Pyxel で作る。[note]
Python のおすすめの入門書
森 巧尚 (著)「Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ」(翔泳社)
森 巧尚 (著)「Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!」(翔泳社)
森 巧尚 (著)「Python2年生 データ分析のしくみ 体験してわかる! 会話でまなべる!」(翔泳社)
森 巧尚 (著)「Python2年生 デスクトップアプリ開発のしくみ 体験してわかる!会話でまなべる!」(翔泳社)
森 巧尚 (著)「Python3年生 ディープラーニングのしくみ 体験してわかる!会話でまなべる!」(翔泳社)
森 巧尚 (著)「Python3年生 機械学習のしくみ 体験してわかる! 会話でまなべる!」(翔泳社)
[ サイトマップを見る ]