Arduino UNO 3で素数の計算し、ベンチマークする。(除算)


参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/


https://terakoya.ameba.jp/a000001446/


https://tools.m-bsys.com/calculators/prime_number.php


x 過去ログを見よ!!
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。

結果

![o_coq670.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ff22ab5f-d541-26e2-3e19-76f9b19cfe84.jpeg)


プログラム

```c++

//0~99991までの整数値を素数判定するのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
bool isPrime(unsigned long n) {
    // 2未満の数は素数ではない
    if (n <= 1) {
        return false;
    }
    // 2は素数
    if (n == 2) {
        return true;
    }
    // 偶数は素数ではない
    if (n % 2 == 0) {
        return false;
    }
    // nを2からsqrt(n)までの数で割ってみて、割り切れるかどうかを確認
    // 割り切れる場合、素数ではない
    for (unsigned long i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    // それ以外の場合、素数である
    return true;
}
void loop() {
  
  unsigned long start_time, end_time;
  unsigned long time;
  bool result;
  unsigned long x;
  unsigned long p=0;
  Serial.println("start");
  start_time = millis();
  for(x=0;x<=99991;x++){
    result=isPrime(x);
    if(result == true){p++;}
#if DEBUG
    Serial.print(x);
    Serial.print("\t");
    Serial.println(result);
#endif
  }
  
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x-1); //最後の値の出力
  Serial.print('-');
  Serial.println(p); //素数のカウントの出力 最適化対策
  Serial.print("StartTime:"); 
  Serial.print(start_time); 
  Serial.print(" EndTime:"); 
  Serial.print(end_time); 
  Serial.print(" Time:"); 
  Serial.println(time); 
  Serial.println(result);   
  delay(1000);//1秒待機
}


```


----------------------------------------


修正前　まちがい
----------------------------------------


```c++


//0~50000までの整数値を素数判定するのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
bool isPrime(unsigned long n) {
    // 2未満の数は素数ではない
    if (n <= 1) {
        return false;
    }
    // 2は素数
    if (n == 2) {
        return true;
    }
    // 偶数は素数ではない
    if (n % 2 == 0) {
        return false;
    }
    // nを2からsqrt(n)までの数で割ってみて、割り切れるかどうかを確認
    // 割り切れる場合、素数ではない
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    // それ以外の場合、素数である
    return true;
}
void loop() {
  
  unsigned long start_time, end_time;
  unsigned long time;
  bool result;
  unsigned long x;
  unsigned long p=0;
  Serial.println("start");
  start_time = millis();
  for(x=0;x<(50000*2);x++){
    result=isPrime(x);
    if(result == true){p++;}
#if DEBUG
    Serial.print(x);
    Serial.print("\t");
    Serial.println(result);
#endif
  }
  
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x); //最後の値の出力
  Serial.print('-');
  Serial.println(p); //素数のカウントの出力 最適化対策
  Serial.print("StartTime:"); 
  Serial.print(start_time); 
  Serial.print(" EndTime:"); 
  Serial.print(end_time); 
  Serial.print(" Time:"); 
  Serial.println(time); 
  Serial.println(result);   
  delay(1000);//1秒待機
}


```