裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ベクトル演算は強力だなぁ

2014年05月14日 | ブログラミング

ピタゴラスの定理の整数解(原始ピタゴラス数)」ですが...

元のプログラムは,私のマシンだと1秒ほどかかる。
> system.time({
+     ## ピタゴラスの定理
+     library(gmp)
+     n = 1000
+     i = 1
+     ans = matrix(0, floor(n) * 3, ncol = 3)
+
+     for (a in 1:n) {
+         for (b in 1:n) {
+             if (a <= b) {
+                 if (floor(sqrt(a * a + b * b)) == sqrt(a * a + b * b)) {
+                     temp = c(a, b, sqrt(a^2 + b^2))
+                     if (Reduce(gcd, temp) == 1) {
+                         ans[i, ] = c(a, b, sqrt(a^2 + b^2))
+                         i = i + 1
+                     }
+                 }
+             }
+         }
+     }
+
+     ans = ans[apply(ans, 1, sum) != 0, ]
+ })

   ユーザ   システム       経過  
     1.004      0.007      1.003

あまりよいプログラムではないが,ベクトル演算を使うと3.7倍ほど速くなる。
> system.time({
+     library(gmp)
+     n = 1000
+     d = expand.grid(1:n, 1:n)
+     s = sqrt(rowSums(d^2))
+     d = cbind(d, s)
+     d = d[floor(s) == s & d[, 1] <= d[, 2], ]
+     GCD = apply(d, 1, function(x) Reduce(gcd, x))
+     d = unique(d/GCD)
+     d = d[order(d[, 1]), ]
+ })

   ユーザ   システム       経過  
     0.280      0.010      0.301

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村