見出し画像

高校数学10分プログラミング(44日目、2024年8月1日)

おはようございます。

今日は、高校数学10分プログラミングの44日目です。

本日の課題は、互いに素となる自然数の個数を数えるプログラムを作成することです。


課題

100以下の自然数で、15と互いに素である自然数の数を求めて、結果をコンソールに出力するプログラムを作成してください。
なお、この個数は解析的に計算することができますが、今回は100以下の自然数を一つ一つ、15と互いに素であるかどうか調べていくことでその個数を数えてください。2つの自然数が互いに素であるかどうかは2つの自然数の最大公約数が1になっているかどうかで判定します。2つの自然数の最大公約数を求める関数 getGCD はすでに課題『高校数学10分プログラミング(43日目、2024年7月31日)』で作成していますので、その関数 getGCD を利用してください。


ヒント

以下のソースコード1は、100以下の自然数で、15と互いに素である自然数の数を求めて、結果をコンソールに出力するプログラムになります。ただし、まだプログラムは完成していません。

// 100以下の自然数で、15と互いに素である自然数の数
void setup(){

  int N_max, N_comp;
  N_max = 100;
  N_comp = 15;
 
  // N_max以下の素数を求める
  ArrayList<Integer> prime_numbers = getPrimeFactors(N_max);
  
  int count = 0; // N_compと互いに素となる自然数を数える

  // 100以下の自然数を一つ一つ、15と互いに素であるかどうか調べて個数を数える処理

  println(count);
}

// 整数N以下の素数を求める関数
ArrayList<Integer> getPrimeFactors(
  int N // 2以上の整数
){
  // int型の可変配列を準備する
  ArrayList<Integer> prime_numbers = new ArrayList<Integer>();
  // 最初の素数2を可変配列に追加
  prime_numbers.add(2);
 
  boolean pn_flag; // 素数かどうかのフラグ
  // 3以上N以下の整数について素数であるかを確認する
  for(int n=3; n<=N; n++){
    pn_flag = true;
    for(int m=2; m<n; m++){
      if( n%m == 0 ){ // mで割り切れたらnは素数でない
        pn_flag = false;
      }
    }
    if(pn_flag){
      prime_numbers.add(n); // iが素数と判定された場合、可変配列に追加
    }
  }
  
  return prime_numbers;
}

// 素因数分解を行う関数
ArrayList<Integer> primefactorization(
  int N, // 2以上の整数
  ArrayList<Integer> prime_numbers // N以下の素数
){
  // 素因数分解したときの各冪に対する指数
  ArrayList<Integer> exponents = new ArrayList<Integer>();
  
  // 整数Nを素因数分解する
  boolean divisible_flag; // 割り切れたかどうかを判定するフラグ
  int quotient = N; // 素数で割ったときの商
  int pn; // 素数を代入する変数
  int exponent_count;
  for(int i=0; i<prime_numbers.size(); i++){
    pn = prime_numbers.get(i); // i番目の素数を取り出す
    divisible_flag = true;
    exponent_count = 0;
    while(divisible_flag){
      if( quotient % pn == 0 ){ // 商が素数pnで割り切れた場合
        exponent_count++; // pnに対する指数の値を1増やす
        quotient = quotient / pn; // 商を更新する
      } else { // 素数pnがNの素因数ではない、またはpnがNの素因数としてすべて算出された場合
        divisible_flag = false; 
      }
    }
    exponents.add(exponent_count);
  } 
  
  return exponents;
}

// 整数MとNの最大公約数を求める関数
int getGCD(
  int M,
  int N,
  ArrayList<Integer> prime_numbers
){
  // M, Nをそれぞれ素因数分解する
  ArrayList<Integer> exponents_M = primefactorization(M, prime_numbers);
  ArrayList<Integer> exponents_N = primefactorization(N, prime_numbers);

  // MとNの最大公約数を求める
  float GCD = 1.0; // 最大公約数
  int exponents_GCD; // 最大公約数を素因数分解した時のi番目の冪の指数
  for(int i=0; i<prime_numbers.size(); i++){
    if( exponents_M.get(i) < exponents_N.get(i)){
      exponents_GCD = exponents_M.get(i);
    } else {
      exponents_GCD = exponents_N.get(i);
    }
    GCD = GCD * pow(prime_numbers.get(i), exponents_GCD);
  }
  
  return (int)GCD;
}

ソースコード1 100以下の自然数で、15と互いに素である自然数の数を求めて、結果をコンソールに出力するプログラム(未完成)

ソースコード1の

  // 100以下の自然数を一つ一つ、15と互いに素であるかどうか調べて個数を数える処理

の部分に、100以下の自然数を一つ一つ、15と互いに素であるかどうか調べて個数を数える処理を実装して、プログラムを完成させてください。


それでは、よろしくお願いします。

MK's papa

この記事が気に入ったらサポートをしてみませんか?