生日悖论

生日悖论C++代码

匿名 (未验证) 提交于 2019-12-02 23:48:02
#include <ctime> #include <iostream> #include <algorithm> using namespace std; class birthday { public: birthday(int n = 10000, int m = 50) : n(n), m(m) {} void test() { srand((unsigned)time(nullptr)); int cnt = 0; for (int i = 0; i < n; ++i) { bool *p = new bool[365]; fill(p, p + 365, false); for (int j = 0; j < m; ++i) { auto x = rand() % 365; if (p[x]) break; else { p[x] = true; cnt++; } } delete[] p; } cout << cnt * 1.0 / n << endl; } private: int n; //实验次数 int m; //人数 }; int main() { birthday a; a.test(); return 0; }

Pollard-Rho 总结

穿精又带淫゛_ 提交于 2019-11-27 21:08:42
将一个大数 \(N\) 分解质因子。 试除法,暴力枚举 \(1~\sqrt{N}\) 的数。时间复杂度: \(O(\sqrt{N})\) 。 通常,这个复杂度够了,但有时, \(N\leq10^18\) 。 考虑一种糟糕的做法:随机法。随机一个 \(1~\sqrt{N}\) 的数,判断能否整除。期望需要 \(\sqrt{N}\) 次。 考虑用“生日悖论”优化。 生日悖论,指如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。 首先,考虑一种简单情况。设 \(N=p*q(p<q)\) 。 我们发现,随机的数x并不一定要等于p,只要是p的倍数即可,即 \(gcd(N,x)=p\) 。 然而,这样每次的概率仍只有 \(1/\sqrt{N}\) 。 来源: https://www.cnblogs.com/lnzwz/p/11376808.html