- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在写一篇关于素数对当今密码学的重要性的文章。我想开发一个小型应用程序,显示用 C(低级语言,至少对我来说)编写的程序将一个复合数分解为质因数需要多长时间。我想出了一个简单的算法来做到这一点,但我遇到了一个问题:
我希望用户能够输入巨大的数字,例如:7777777777777777777777777772
所以计算机需要几个小时来处理它,这表明我们基于素数的密码学有多好。
但在 C 语言中,我能找到的最大数据类型是 LONG,最大可达 2147483646。
你们知道我如何在 C 中输入和处理一个大数字吗?
提前致谢
最佳答案
Factorization of really big numbers
I would like the user to be able to type gigantic numbers, for example: 7777777777777777777777777772
这是一个 93 位数字,不是那么大,因此可以简单地暴力破解它。
<小时/>如果您有权访问unsigned __int128
,则类似于下面的内容。 C 确实指定了 64 位类型,但除此之外,您就得靠自己了。
我估计这种适度的因式分解可能需要几分钟的时间。
https://www.dcode.fr/prime-factors-decomposition 在几秒钟内报告答案。
当然可以有许多改进。
unsigned __int128 factor(unsigned __int128 x) {
if (x <= 3) {
return x;
}
if (x %2 == 0) return 2;
for (unsigned __int128 i = 3; i <= x/i; i += 2) {
static unsigned long n = 0;
if (++n >= 100000000) {
n = 0;
printf(" %llu approx %.0f\n", (unsigned long long) i, (double)(x/i));
fflush(stdout);
}
if (x%i == 0) {
return i;
}
}
return x;
}
void factors(unsigned __int128 x) {
do {
unsigned __int128 f = factor(x);
printf("%llu approx %.0f\n", (unsigned long long) f, (double)x);
fflush(stdout);
x /= f;
} while (x > 1);
}
void factors(unsigned __int128 x) {
do {
unsigned __int128 f = factor(x);
printf("approx %0.f approx %.0f\n", (double) f, (double)x);
fflush(stdout);
x /= f;
} while (x > 1);
}
输出
approx 2 approx 7777777777777778308713283584
approx 2 approx 3888888888888889154356641792
approx 487 approx 1944444444444444577178320896
approx 2687 approx 3992699064567647864619008
99996829 approx 14859790387308
199996829 approx 7429777390798
299996829 approx 4953158749339
399996829 approx 3714859245385
499996829 approx 2971882684351
...
38399996829 approx 38696146902
38499996829 approx 38595637421
approx 1485931918335559335936 approx 1485931918335559335936
<小时/>
正确的答案是使用更高效的算法,然后考虑所需的类型。
关于c - C 中大数的因式分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55192358/
我很抱歉提出一个关于 Eigen3 优化计算方案的一般性问题。假设我们确实拥有两个 Eigen3 矩阵,M 和 N。假设我们需要计算以下内容: Eigen::Matrix M; Eigen::Matr
如果我使用 Sympy 获得了以下方程: 是否可以排列变量,使 x 和 L 在方程中仅显示为 x/L? 最佳答案 用另一个符号(例如 y)替换 x/L 似乎对我有用: >>> import sympy
我不确定我的标题应该是什么。但是,我试图对我的代码进行很好的验证。以下是我的函数中唯一允许使用的代码:c0001、c0002、c0003、c0004、c0005、C0001、C0002、C0003、C
这周我开始较少样式表开发。 我当前的元素有许多不同颜色的链接,例如: #dev-team a { color: #D09EBA; } #admin-team a { color: #0
我试图通过分解 N 来找到 D。 我的 N 是 265291078722948385089717069136983657793 我发现 P & Q 使用 n = p.q P - 1471697682
这个问题在这里已经有了答案: Partitioning in JavaScript [duplicate] (7 个答案) 关闭 7 年前。 假设我有一个数组 = [0,1,2,3,4,5,6],我
我有这个数据框:基本上每一行都是一个客户一天执行的一笔交易。同一客户在同一天和不同日期进行多笔交易。我想获得一个列来显示客户之前访问的次数。 id date purchase id1 date1
我是一名优秀的程序员,十分优秀!