Eterna Esploristo

求道者を目指す者が日々の活動で得たものを記す場所

プログラミング

Rで完全数を求める

 前回「pythonで完全数を求める」という投稿をしましたが、私、統計解析に強いと言われているプログラミング言語「R」も少し勉強しています。その練習も兼ねて、同じプログラムをRで書いてみました。同じプログラムをpythonとRの両方で書いてみることで、コマンドや書式の違いを比較できるのではないかと思います。pythonからRに移植するときのポイントも最後に書いていますので、ぜひご覧ください。
 ではまず、Rの方から。


for (n in 2:10000) {
  x<-1
  for (i in 2:(n^0.5)) {
    if(n/i==floor(n/i)) {
      x<-append(x,floor(i))
      if(n/i!=i){
        x<-append(x,floor(n/i))
      }
    }
  }
  
  sx<-0
  for (i in 1:length(x)) {
    sx<-sx+x[i]
  }
  if (sx==n) {
    print(n)
  }
}

 次に、前回載せたpythonのプログラムです。


for n in range(2,10000):
    x=[1]
    for i in range(2,int(n**0.5+1)):
        if n/i==int(n/i):
            x.append(int(i))
            if n/i!=i:
                x.append(int(n/i))

    sx=0
    for i in range(len(x)):
        sx==sx+x[i]
    if sx==n:
        print(n)

 pythonからRに移植したときに引っかかったポイントを挙げてみます。私のような初心者がつまずきやすいところかと思いますので、参考になればと思います。

  • forループの回数を指定するとき、Rでは指定した最大値を含むが、pythonでは含まない。
    上記のプログラムの1行目を例にすると、
     (python) nが2から9999まで変化する(10000にはならない)
     (R)    nが2から10000まで変化する
  • forループの範囲指定の値は、Rでは整数型にしなくても大丈夫だが、pythonでは整数型にする必要がある。
  • Rでは、代入演算子は”=”ではなく”<-“を使う。
    (ほかのプログラミング言語でも代入には”=”を使うことが多いので、
     慣れないかもしれません。)
  • 配列(行列)に要素を追加するappendの使い方
     (python) x.append(a) 
     (R)    x<-append(x,a) (代入式にしてやる)

 1番目に書いたforループの話ですが、「何回ループさせるか」というだけなら、あまり大きな問題にはならなかったと思います。なぜなら、pythonで
  for n in range(10000):
と書いたら、nがゼロから9999まで変化し、ちゃんと10000回ループするからです。今回のプログラムでは、forループの引数を計算に使用しているので、引数が実際にいくつになるかが重要になるわけです(特に3行目)。

 いかがでしたか。今回は、同じプログラムをpythonとRの両方で書いて、比較できるようにしてみました。今後、違うプログラムでもやってみたいと思います。

コメントを残す




This site uses Akismet to reduce spam. Learn how your comment data is processed.

関連記事