当前位置:   article > 正文

R代码验证1000以内的哥德巴赫猜想——①求素数②偶数分解为两质数之和_r语言判断是否素数的命令

r语言判断是否素数的命令

哥德巴赫猜想提出:

任一个大于2的偶数,都可以表示为两个素数之和。

根据哥德巴赫猜想,本文运用R进行验证。

  • 判断一正数是否是素数;
  • 求出100以内的所有素数;
  • 对任何一个大于2 的偶数,求出一对素数,它们之和等于该偶数,并将结果展示出来。

方法一:直接使用功能函数

***缺点:*只能进行判断,且只能单个数字地进行,不可批量筛选

p<-primes(10)#直接输入数字进行判断
  • 1

方法二:迭代筛选方法计算

运用基本的计算方法对筛选素数,与求和。
***缺点:*计算迭代次数过多,数值越大,时间需花费越多。

#找100之间的素数
a<-0
#1不是素数,所以n从2开始跑
newdata=c()#创建一个空表
n<-2
while (n <= 100){####如果要改个数,就改这里和下面同样四个井号键的地方,保持一致
  f<-0
  i<-2
  #当能被整除等于0,结果不为素数
  while (i < (n-1)){
    if (n%%i==0){
      f=1
      break
    }
    i <- i+1
  }
  if (f == 0){
    newdata=rbind(newdata,n)#每一次循环的数据结果放在表中
    print(n)
    a <- a+1
  }
  n <- n+1
}
paste("100之间的素数有" ,a)
qsg<-newdata[1:3,]#显示数据表的前三行
print(qsg)



fix(sendata)#更改数据表的变量名,要先运行一遍程序,在缓存库中有sendata之后,再执行该操作



#把所有偶数划分为一对相加素数
n2=4
b<-length(newdata[,1])
sendata=c()
repeat{
  for (k in 1:b) {
    x<- newdata[k,1]
    for (j in 1:b){
        y<- newdata[j,1]
        f=x+y
        c<-c(x,y,f)
        sendata=rbind(sendata,c)
        j<- j+1
        }
    k<-k+1  
    }
    newsendata <- sendata[!duplicated(sendata[,3]),]#提取唯一行
    n3<- length(newsendata[,1])
     for(r in 1:n3){
       if(newsendata[r,3] == n2){
         m<- newsendata[r,]
         sy<- list(m)
         print(paste("1000以内的偶数被分解为两素数之和分别是:",sy))
        }      
     }
  n2<- n2+2
  if(n2>100){####如果要改个数,就改这里和上面同样四个井号键的地方,保持一致
    break
  }  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

学习点:
R语言中的三种循环方式:

循环结构意义
for循环也称“计数循环”,比较简明
while循环“当型循环” ,先判断,后执行
repeat循环“直到型循环”,先循环,后判断
  • 当循环次数未知的时候,只能根据某一条件来决定是否进行循环时,用while语句repeat语句实现循环要更方便。
  • repeat语句:repeat…until或repeat if back

方法三:引入功能函数判断是否为素数


sushu <- function(x){
  
  ifelse(0 %in% c(x %% c(2:ceiling(sqrt(x)))),"FALSE","TRUE")
  
}

sushu(17)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法四:将偶数拆分为两个质数之和——下载并运用pracma包

install.packages("pracma")#下载pracma包
#若下载了,后续从liabrary开始运行


library(pracma)#应用
p<-primes(1000)#对素数的直接提取
a<-c()
for(i in seq(from = 4, to = 1000, by = 2)){#偶数
  for(j in p){
    if(j<=i/2 && isprime(i-j) ){
      ss<-c(j,i-j) #ss就是分解偶数为两个素数的素数对
      a<-rbind(a, ss)
      h<- a[,1]+a[,2]#计算两素数之和
      solution<-cbind(a[,1:2],h)
    }
  }
}
print(solution)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 注意:
    这样的代码出来的结果可以显示一个偶数可以分解为的所有质数之和,如果仅需要一对素数和,可以参照方法二的[!duplicated(data[,3]),]数据筛选提取代码。

a<-rbind(a, ss)处延申学习
如果在进行数据接续排列的时候,也可以用append,即a<-append(a, ss)

区别:

  • rbind是将数据用上下方式合并向量或矩阵,拼成一个新的矩阵;
  • append表示的是新产生的数据直接排在后面,不是构成数据表;
  • cbind是数据以左右的方式合并向量或矩阵,拼成一个新的矩阵;

注意:在使用rbind()、cbind()时,注意要事先定义好一个矩阵,在循环迭代的过程中对矩阵进行赋值。如果循环迭代过程中有cbind,会导致循环中反复创建矩阵,是非常耗费时间与运行速度的。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号