你可以帮我解决我的功能出错的地方吗?我想创建一个函数,列出最多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(完美)。
答案 0 :(得分:1)
问题是你生成了2^p - 1
形式的所有数字,但是你不检查它们是否是素数。这仅适用于2^p-1
形式的 primes 您的第一次失败,2096128,是针对p = 11,即2047 * 2048/2但是2047 = 23 * 89不是素数。