📄 big_rand.cpp
字号:
/************************************************** Random BigInt Generation Source File ** (C) 1999-2002 The Botan Project **************************************************/#include <botan/numthry.h>#include <botan/primes.h>namespace Botan {/************************************************** Generate a random integer **************************************************/BigInt random_integer(u32bit bits) { BigInt x; x.randomize(bits); return x; }/************************************************** Generate a random integer within given range **************************************************/BigInt random_integer(const BigInt& min, const BigInt& max) { BigInt range = max - min; if(range <= 0) throw Invalid_Argument("random_integer: invalid min/max values"); return (min + (random_integer(range.bits() + 1) % range)); }/************************************************** Generate a random prime **************************************************/BigInt random_prime(u32bit bits, const BigInt& coprime) { if(bits <= 16) throw Invalid_Argument("random_prime: Can't make a prime of " + to_string(bits) + " bits"); if(coprime <= 0) throw Invalid_Argument("random_prime: comprime must be > 0"); while(true) { BigInt p(Random, bits); p.set_bit(bits - 2); p.set_bit(0); SecureVector<u32bit> sieve(100); for(u32bit j = 0; j != sieve.size(); j++) sieve[j] = p % PRIMES[j]; u32bit counter = 0; while(true) { if(counter == 4096 || p.bits() > bits) break; bool passes_sieve = true; counter++; p += 2; for(u32bit j = 0; j != sieve.size(); j++) { sieve[j] = (sieve[j] + 2) % PRIMES[j]; if(sieve[j] == 0) passes_sieve = false; } if(!passes_sieve || gcd(p - BigInt::one(), coprime) != BigInt::one()) continue; if(passes_mr_tests(p)) return p; } } }/************************************************** Generate a random safe prime **************************************************/BigInt random_safe_prime(u32bit bits) { if(bits <= 16) throw Invalid_Argument("random_safe_prime: Can't make a prime of " + to_string(bits) + " bits"); BigInt p; do p = (random_prime(bits - 1) << 1) + BigInt::one(); while(!is_prime(p)); return p; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -