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