第6回
互除法, エラトステネスの篩, 繰り返し二乗法, 合同式
担当 : aotsuki
KMC-ID : aotsuki
slack(内部チャット)
ささっと、やりましょう!
ll gcd(ll a, ll b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
// 戻り値は gcd, xd と yd に解が入る。
ll extgcd(ll a, ll b, ll &xd, ll &yd) {
if (b == 0) {
xd = 1, yd = 0;
return a;
}
ll gcd = extgcd(b, a % b, yd, xd);
yd -= (a / b) * xd;
return gcd;
}
やっていることはユークリッドの互除法と同じ
O(log max{a,b})
for (int i = 2; i <= N; i++) {
bool is_prime = true;
for (int prime : primes) {
is_prime = is_prime && (i % prime != 0);
}
if (!is_prime) continue;
primes.push_back(i);
}
以下を繰り返す
vector<int> res; //求めた素数を入れる配列
vector<bool> is_prime(N + 1, true);
for (int p = 2; p <= N; p++) {
if (!is_prime[p]) continue;
// p の倍数を全て消す。
for (int k = p * 2; k <= N; k += p) is_prime[k] = false;
res.push_back(p);
}
int z; //zは何らかの整数
int S=sqrt(z);
int f=0;
for (int p = 2; p <= S; p++) {
if(z%p==0)f=1;
}
if(f==0){
//zが素数だった時
}
ll pow_naive_for(ll a, int b) {
ll res = 1;
for (int i = 0; i < b; i++) { res *= a; }
return res;
}
しかし...
簡単な例で見ていきましょう
ll pow_ans(ll x, int n) {
ll res = 1;
while (n > 0) {
if (n & 1) { res *= x; }
x *= x;
n >>= 1;
}
return res;
}
(復習)
ビット演算とは
ビット演算の利点
ビット演算子の種類
NOT (否定) ~x
x | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
~x | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
AND (論理積) x&y
x | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
y | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
x&y | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
OR (論理和) x|y
x | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
y | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
x|y | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
XOR (排他的論理和) x ^ y
x | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
y | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
x^y | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
右シフト x >> n
x | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
x>>n | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
{
{
n=2
x : unsigned char
空いた桁は0で埋まる
このbitは捨てられる
(ほぼ)
左シフト x << n
x | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
x<<n | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
{
{
n=2
x : unsigned char
空いた桁は0で埋まる
このbitは捨てられる
a を任意の自然数、 p を素数とする。このとき、
\(a^p\equiv a\pmod{p}\)
特に、 a と p が互いに素なら
\(a^{p-1}\equiv 1\pmod{p}\)
http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja
もしくは
「 AOJ 」で検索