京大マイコンクラブが教える絶対に失敗しない言語の選び方
キミには 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;
}
}
}