c# - 计算 BigInteger 的平方

标签 c# math .net-4.0 complexity-theory biginteger

我正在使用 .NET 4 的 System.Numerics.BigInteger structure .

我需要计算非常大的数的平方 (x2) - 数百万位小数

如果x是一个BigInteger,那么时间复杂度是多少:

x*x;

BigInteger.Pow(x,2);

?

如何使用 .NET 4 BigInteger 以最快的方式乘以如此大的数字?是否有 Schönhage–Strassen algorithm 的实现? ?

最佳答案

这取决于您的数字有多大。正如维基百科页面告诉您的那样:

In practice the Schönhage–Strassen algorithm starts to outperform older methods such as Karatsuba and Toom–Cook multiplication for numbers beyond 2215 to 2217 (10,000 to 40,000 decimal digits).

System.Numerics.BigInteger 使用 Karatsuba algorithm或标准教科书乘法,取决于数字的大小。 Karatsuba 的时间复杂度为 O(n log2 3)。但是,如果您的数字小于上面引用的数字,那么您可能不会从实现 Schönhage–Strassen 中看到太多加速。

至于 Pow() 这本身在计算期间至少对数字进行一次平方(它通过简单地执行 num * num 来做到这一点——所以我认为这赢了也更有效率。

关于c# - 计算 BigInteger 的平方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3066007/

相关文章:

c# - 由于 AutoResetEvent 信号处于 WaitOne 状态,线程在应用程序终止后仍然存在

c# - 支持 .NET 4.0 中的进度报告和增量结果 "Task Parallel Library"

c# - 由特定通用包含接口(interface)参数化的通用容器接口(interface)

c# - 使用 Mailkit 通过 IMAP 保存附件

c# - 使用 Mongodb-CSharp Driver 调用函数

c# - 使用最小起订量和 nunit 测试 web api Controller 时如何模拟用户身份?

c# - 在 C# 中计算整数 log2 的最快方法是什么?

javascript - 如何将物体从头到尾移动半圈?

java - 为什么我们在寻找素数时可以使用 sqrt(n) 而不是 n/2 作为上限?

c# - MSBuild 处理循环依赖