裏 RjpWiki

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

条件を満たす素数の組

2014年10月06日 | ブログラミング

outer は,実に使いでのある関数だ

# 差が 6 の素数の組
n = 2:500
m = n[1-outer(n, n)]
index = which(outer(m,  m, "-") == 6, arr.ind=TRUE)
cat(paste(apply(matrix(m[index], ncol=2), 1, function(x) sprintf("(%i,%i)", x[2], x[1])), collapse=","))
# または
cat(paste(mapply(function(x, y) sprintf("(%i,%i)", x, y), m[index[,2]], m[index[,1]]), collapse=","))
出力
(5,11),(7,13),(11,17),(13,19),(17,23),(23,29),(31,37),(37,43),(41,47),(47,53),(53,59),(61,67),(67,73),(73,79),(83,89),(97,103),(101,107),(103,109),(107,113),(131,137),(151,157),(157,163),(167,173),(173,179),(191,197),(193,199),(223,229),(227,233),(233,239),(251,257),(257,263),(263,269),(271,277),(277,283),(307,313),(311,317),(331,337),(347,353),(353,359),(367,373),(373,379),(383,389),(433,439),(443,449),(457,463),(461,467)

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

数列の和

2014年10月06日 | ブログラミング

1:N までの数列から,2の倍数(2, 4, 6, ...)と3の倍数(3, 6, 9, ...)を取り除いた数列の和

func1 = function(N) {
    n = 1000000
    x = 1:n
    x[1:(n%/%2)*2] = 0
    x[1:(n%/%3)*3] = 0
    x = x[x != 0]
    if (N > length(x)) return(NA)
    else return(sum(x[1:N]))
}
func2 = function(N) {
    m = N%/%2
    s = 1
    for (i in seq_len(m)) {
        s = s+12*i
        s = s-(i == m && N%%2==0)*(6*i-1)
    }
    s
}
func3 = function(N) {
    m = N%/%2
    1 + sum(12 * seq_len(m)) - (!N%%2) * (m * 6 + 1)
}

> func3(1)
[1] 1
> func3(2)
[1] 6
> func3(3)
[1] 13
> func3(4)
[1] 24
> func3(5)
[1] 37

> N = 12345
> func1(N)
[1] 228598537
> func2(N)
[1] 228598537
> func3(N)
[1] 228598537

> library(rbenchmark)
> benchmark(func1(N), func2(N), func3(N))
      test replications elapsed relative user.self sys.self user.child sys.child
1 func1(N)          100  10.722   1787.0    10.275    0.624          0         0
2 func2(N)          100   1.383    230.5     1.450    0.013          0         0
3 func3(N)          100   0.006      1.0     0.005    0.001          0         0

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

群数列の問題だな

2014年10月06日 | ブログラミング

func2 <- function(n) {
    stopifnot(n <= 1388888888888885)
    # 桁数の同じ数を一群とする (5,6,7,8,9), (10,11,...,99), (100,101,...,999), (1000,1001,...,9999),...
    head <- 5 # 群の最初の数値 5, 10, 100, 1000,...
    kosuu <- 5 # 群に含まれる数値の個数 5, 90, 900, 9000,...
    keta <- 1  # 群に含まれる数値の桁数 1, 2, 3, 4,...
    end <- 0 # 群の最後の数値の1の位までの文字数(最初を1と数えて)
    repeat {
        begin <- end + 1 # 群の最初の数値の最上位までの文字数 1, 6, 186, 2886,...
        end <- begin + keta * kosuu - 1 # 群の最後の数値の1の位までの文字数(最初を1と数えて)5, 185, 2885, 38885,...
        if (begin <= n && n <= end) { # n がその群に含まれる数値中にある n = 215 なら,100 で始まる 3 桁の数字の群の中にある186 < 215 < 2885
#            dump(c(head=head, kosuu=kosuu, keta=keta, begin=begin, end=end))
            mojiiti <- n - begin # 群の最初の数値の最上位から何番目の文字か 215-186=29番目。ただし,0から数える。
            number <- head + mojiiti %/% keta # どの数値中の文字か 100 + 29 %/% 3 = 109 の中の 29%%3=2番目。ただし,0から数える。
            ans <- unlist(strsplit(as.character(number), ""))[mojiiti %% keta + 1] # 数値中のどの文字か
            return(as.integer(ans))
        }
        head <- 10 ^ keta # 次の群のために更新
        kosuu <- 9 * head
        keta <- keta + 1
    }
}
# head            kosuu         keta    begin             end
#  100            900                3    186                 2885
#  1000            9000            4    2886             38885
#  10000        90000            5    38886             488885
#  100000        900000            6    488886             5888885
#  1000000        9000000            7    5888886             68888885
#  10000000        90000000        8    68888886         788888885
#  100000000        900000000        9    788888886         8888888885
#  1000000000    9000000000        10  8888888886         98888888885
#  10000000000        90000000000        11    98888888886        1088888888885
#  100000000000        900000000000        12    1088888888886    11888888888885
#  1000000000000    9000000000000    13  11888888888886    128888888888885
#  10000000000000    90000000000000    14  128888888888886 1388888888888885
options(scipen=10)
func2(579334) # 7
func2(62346205) # 6
func2(787925698) # 9
func2(1234567890) # 5
func2(3333333333) # 0
func2(8888888886) # 1
func2(58888886) # 4
func2(186) # 1
func2(2886) # 1
func2(38886) # 1
func2(488886) # 1
func2(5888886) # 1
func2(68888886) # 1
func2(788888886) # 1
func2(9888888886) # 1
func2(1088888888886) # 1
func2(11888888888886) # 1
func2(1388888888888885) # 9

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

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

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