从mersenne primes中找到完美的数字 - 非常奇怪的结果

时间:2017-03-12 23:36:30

标签: r

你可以帮我解决我的功能出错的地方吗?我想创建一个函数,列出最多2 ^ N -1的完美数字,使用的事实是,如果q是一个梅森素数(形式为2 ^ p - 1的素数,其中p也是素数)那么q(q + 1)/ 2是一个完美的数字。我做了4个函数:一个用于查找因子,一个用于查找素数,一个用于查找Mersenne素数,然后用于查找完美数字。它们似乎都运行正常,直到我在上一个函数中让N = 4:它给出了前4个完美数字并且最后正确,但倒数第二个并不是一个完美的数字。

请有人让我知道我哪里出错了吗?

factorlist<-function(n){
if (n<2){return("Invalid input")}
if (n%%1!=0){return("Invalid input")}
vec<-0
for(i in 1:(n-1)){
if (n%%i==0){
vec[length(vec)]<-i
vec<-c(vec,0)
}
}
vec<-vec[-length(vec)]
return(vec)
}

prime <- function(n){
  primeR <- function(p, i = 1){
    f <- p %% p[i] == 0 & p != p[i]
    if (any(f)){
      p <- primeR(p[!f], i+1)
    }
    p
  }
  primeR(2:n)
}

MersenneNumber<-function(n){
  vec<-c(0)
  for (i in 3:n){
    vec<-union(vec, c(2^prime(i)-1))
  }
  return(vec[-length(1)])
}

MersennePerfect<-function(N){
 vec<-0
   for (i in 3:(2^N-1)){
     vec<-union(vec, c((MersenneNumber(i)*(MersenneNumber(i)+1))/2))
 }
 return(vec[-length(1)])
}

MersennePerfect(4)给出6,28,496,8128(全部完美),2096128(不完美),33550336(完美)。

1 个答案:

答案 0 :(得分:1)

问题是你生成了2^p - 1形式的所有数字,但是你不检查它们是否是素数。这仅适用于2^p-1形式的 primes 您的第一次失败,2096128,是针对p = 11,即2047 * 2048/2但是2047 = 23 * 89不是素数。