京大マイコンクラブが教える絶対に失敗しない言語の選び方

キミには C++ がオススメだ!

速い!!

C++は、業界最速のC言語に引けをとらないぐらい、高速に実行できるプログラムを書くことができるぞ!

なんでもできるぞ!!

C++にはガーベジコレクションがないので、メモリ管理を手作業で制御して、最適化することができるぞ。 システムプログラミングやリアルタイム処理をしたいなら、C++を使うといいぞ!

実行する前に計算は終わっている!!

C++使いたちは実行時コストを嫌うので、なんでもかんでもコンパイル時に済ませようとするぞ! テンプレートメタプログラミングやコンパイル時計算(constexpr)を駆使すれば、コンパイル時にほとんどの計算を終わらせることだって可能だ!

サンプルコード


// C++14
#include <iostream>
#include <tuple>

constexpr bool is_even(int n) {
  return n % 2 == 0;
}
constexpr int square(int n) {
  return n * n;
}
constexpr int mod_pow(int a, int b, int n) {
  if (b < 0) {
    return 0;
  } else if (b == 0) {
    return 1;
  } else if (is_even(b)) {
    return square(mod_pow(a, b / 2, n)) % n;
  } else {
    return (a * mod_pow(a, b - 1, n)) % n;
  }
}
constexpr std::tuple<int, int> factorize(int n) {
  if (is_even(n)) {
    const auto p = factorize(n / 2);
    const auto d = std::get<0>(p);
    const auto s = std::get<1>(p);
    return std::make_tuple(d, s + 1);
  } else {
    return std::make_tuple(n, 0);
  }
}
constexpr bool miller_test(int a, int n) {
  if (a < n) {
    const auto f = factorize(n - 1);
    const auto d = std::get<0>(f);
    const auto s = std::get<1>(f);
    for (int r = 0; r < s; ++r) {
      const auto m = mod_pow(a, d * (1 << r), n);
      if ((r == 0 && m == 1) || m == n - 1) {
        return true;
      }
    }
    return false;
  }
  return true;
}
constexpr bool is_prime(int n) {
  if (n < 2) {
    return false;
  } else if (is_even(n)) {
    return n == 2;
  } else {
    const auto a2 = miller_test(2, n);
    const auto a7 = miller_test(7, n);
    const auto a61 = miller_test(61, n);
    return a2 && a7 && a61;
  }
}
int main() {
  for (int i = 0; i < 100; ++i) {
    if (is_prime(i)) {
      std::cout << i << std::endl;
    }
  }
}