#----------- # 双子素数(twin prime)のリストを生成、テキスト形式で保存 # ※素数のリストはあらかじめ用意 #----------- # 環境変数、初期変数の設定 rfold="D:\\R\\prime_number" #素数データ保存フォルダ rfile=paste(rfold,"\\primelist1e+07.txt",sep="") #素数ファイル sfold="D:\\R\\twin_prime" #データ保存フォルダ sfile="tplist.txt" #保存ファイル名 options(scipen=100) #指数表記回避 #---------- setwd(sfold) #カレントディレクトリの変更 arr_pn<-read.csv(rfile,header=FALSE) #素数データの格納 maxi=nrow(arr_pn) #データ数 arr_tp <- numeric(1) #双子素数を格納する配列(0を並べた配列を用意) cat("素数のデータ数=",maxi,"\n") viewval=as.integer(maxi/10) #画面表示判定用 i=2 #i番目の素数 j=1 #j番目の双子素数 sink("log.txt") #ログファイルの初期化 sink() sink(sfile) #保存ファイルの初期化 sink() starttime<-proc.time() #経過時間の初期値 flag<-0 #ループ判定用 while(i<=maxi && flag==0){ #探索範囲 dif=arr_pn[i,1]-arr_pn[i-1,1] #素数の差分 if(dif==2){ #差分が2であれば双子素数なので追記保存 arr_tp[j]=arr_pn[i-1,1] sink(sfile,append=TRUE) cat(arr_tp[j],",",arr_tp[j]+2,"\n") sink() if(arr_tp[j]>1000000000000000){ #大きすぎる数字になった場合はフラグを立ててループを抜ける flag=1 cat("1000000000000000より大きい数字\n") } j=j+1 } if(i%%viewval==0 && j>1){ #画面表示の条件 endtime<-proc.time() keika=(endtime-starttime)[3] sink("log.txt",append=TRUE) cat("tp(",i-1,")=",arr_tp[j-1]," ",arr_tp[j-1]+2," 経過時間=",keika,"\n") sink() cat("tp(",i-1,")=",arr_tp[j-1]," ",arr_tp[j-1]+2," 経過時間=",keika,"\n") } i=i+1 } rm(list=ls(all=TRUE)) #全体の初期化