第16講 素数探索
第6話 2以外の偶数を探索対象から外す
改良例
#include<iostream>
#include<math.h>
#include <time.h>
using namespace std;
void f();
char sh(int i);
int s[1000000],cn;
void main(){
   clock_t hj,ow; //clock_t型の宣言、プログラム開始時間を取得するための変数
   hj=clock();
   f();
   ow=clock();
   cout<<"素数生成にかかった時間は"<<(double)(ow-hj)/1000<<"秒です。"<<endl;
   cout<<"プロジェクト終了"<<endl;
}
void f(){
   int i,j;
   s[0]=2;
   cn=1;
   cout<<2<<" ";
   for(i=3;i<10000001;i+=2){
     if(sh(i)==1){
        s[cn]=i;
        if(cn%10==0 && cn>0)cout<<endl;
        cn++;
        cout<<i<<" ";
     }
   }
   cout<<endl<<"素数は"<<cn<<"個できました。"<<endl;
}
char sh(int i){
   if(i==2)return(1);
   if(i==3)return(1);
   //if(i%2==0)return(0);
   int j;
   double w;
   w=sqrt((double)i);
   for(j=0;j<cn;j++){
     if(i%s[j]==0)return(0);
     if(s[j]>w)return(1);
   }
}
参考ダウンロード添付ファイル改良1
実行結果
m
前の実行結果
n
この結果を見ると、速くなったように見えますが、
何回も実験してみると、結果が逆になってしまうこともあります。
実験誤差が結構あります。
そこで、両者の差をより正確に見るために、
第5話と第6話のソースを改良し、
第5話実験ファイル 第6話実験ファイル
100回の平均値を取って実験してみると、
第6話ファイル実験結果
t
第5話ファイル実験結果
u

確かに少しは速くなったようです。
この後、3以外の3の倍数を外すプログラムを考える予定でしたが、
偶数を外す実験から、効果は期待できそうもありません。

素数探索の高速化・・・
これは意義のある研究です。
RSA理論による暗号が素数を暗号鍵にしているからです。
セキュリティを万全にするためには、
ハッカーが考える方法を、
事前に予測して、潰しておく必要があるからです。

高速化する1つの方法は、
第18講で学ぶ予定になっているマルチスレッドプログラミングです。
これは、並列処理です。
量子コンピュータも並列処理によって高速化を実現するものです。
シングルスレッド・・・直列処理
マルチスレッド  ・・・並列処理
シングルスレッドって何?
直列処理とは?
マルチスレッド??
並列処理・・・!?
興味のある方、講義を続けて読みましょう。

シングルスレッドでは、
今のところこれ以上高速化するアイデアは、
私にはありません。
ですから、高速化は第18講に委ねて第16講を終了することにします。



第5話へ
 第17講第1話へ

a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ