我需要计数a的小数位数BigInteger.例如:
99 回报 21234 回报 49999 回报 412345678901234567890 回报 20我需要做的这一个BigInteger与184948十进制数字多.我怎样才能快速,可扩展?
在转换到字符串的方法是缓慢的:
public String getWritableNumber(BigInteger number) {
// Takes over 30 seconds for 184948 decimal digits
return "10^" + (number.toString().length() - 1);
}
Run Code Online (Sandbox Code Playgroud)
这种循环 - 十分之一的方法甚至更慢:
public String getWritableNumber(BigInteger number) {
int digitSize = 0;
while (!number.equals(BigInteger.ZERO)) {
number = number.divide(BigInteger.TEN);
digitSize++;
}
return "10^" + (digitSize - 1);
}
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法?
我可以计算两个BigIntegers(比如a和b)模数n的乘法.
这可以通过以下方式完成:
a.multiply(b).mod(n);
Run Code Online (Sandbox Code Playgroud)
但是,假设a和b具有相同的n阶,则意味着在计算过程中,正在计算新的BigInteger,并且其长度(以字节为单位)为~ 2n.
我想知道我是否可以使用更高效的实现.像modMultiply这样的东西像modPow一样实现(我相信它不会计算功率,然后是模数).
作为一个可选的赋值,我正在考虑编写自己的BigInteger类实现,在那里我将提供自己的加法,减法,乘法等方法.
这将是任意长整数,甚至数百位长.
在对这些数字进行数学计算时,逐位数字并不难,您认为最好的数据结构代表我的"BigInteger"是什么?
起初我正在考虑使用一个数组,但后来我认为在一次大的加法或乘法之后我仍然可能会溢出(用完数组插槽).这是一个使用链表的好例子,因为我可以处理O(1)时间复杂度的数字?
是否有一些其他数据结构甚至比链表更适合?我的数据结构所保存的类型应该是我可用的最小可能整数类型吗?
另外,我应该小心如何存储我的"carry"变量?它本身应该是我的"BigInteger"类型吗?
我有一个BigInteger参数的方法(在第三方库中):
public void setValue (BigInteger value) { ... }
Run Code Online (Sandbox Code Playgroud)
我不需要"全部力量",我只需要使用整数.那么,我如何将整数传递给这个方法呢?我的解决方案是从int值获取字符串值,然后从字符串创建BigInteger:
int i = 123;
setValue (new BigInteger ("" + i));
Run Code Online (Sandbox Code Playgroud)
还有其他(推荐)方法吗?
在我的一个模块中,我必须处理无限的概念.到目前为止,我一直在使用9**9**9正无穷大,这似乎运作良好,速度快,似乎是perl的内部用作无限.
但是,如果我的模块的用户决定使用其中一个大数字模块(例如use bigint;),然后他们使用inf或Math::BigInt->binf()表示无穷大,事情会有点冒险.
在某些地方它似乎工作正常,但在其他地方,比较应该是真的或应该是错误的最终错误的方式导致难以追踪错误.
我想支持无限的其他各种概念,它们可以使用普通的perl数和任意精度数.
但我也对性能表示担忧,因为我对无穷大的一些比较发生在紧密的内环中.显然,inffrom Math::BigInt会慢于9**9**9(由于在每次访问时调用绑定或重载方法).过去有没有人处理过这个问题?如果是这样,你的解决方案是什么?
我已经考虑过将自己的常量用于无穷大,定义如下:
use constant INF => if_any_bignum_modules_loaded()
? Math::BigInt->binf
: 9**9**9;
Run Code Online (Sandbox Code Playgroud)
然后向我的模块添加警告,首先应该加载任何bignum模块.这听起来合情合理吗?是否有可靠的实施if_any_bignum...,或者我应该自己推出?
我知道我可以在Perl中有条件地使用模块但是"pragma"呢?我的测试表明,use bigint在Perl 中可能比普通数学慢得多,我只需要它来处理64位整数,所以我只想在Perl没有用64位整数支持构建时使用它,我也知道如何检查是否使用该Config模块.
我尝试了各种各样的东西eval和BEGIN块,但无法找到有条件使用bigint的方法.我知道我可以使用Math::BigInt但是我不能为bigint和64位情况使用单个代码路径.
想象一个实例BigInteger,然后在创建实例后如何初始化它?
例如:
BigInteger t = new BigInteger();
Run Code Online (Sandbox Code Playgroud)
如何投入价值t?
如果无法调用构造函数,那么可以做什么,将值放在对象中?
有人能告诉我一个好的C++库,用于处理(执行操作等等)任意大数(它可以是一个处理任意精度浮点数的库,但处理整数更重要)?
请只引用您使用的资料库,并告诉我你是怎么设法设置它,并把它捡起来,也许一个非常简约的例子或东西(基本上,如果提到图书馆没有良好的文档提供一些自己的输入).
为了记录,我在x64机器上使用Windows 7,CodeBlocks作为我的IDE,最新的MinGW作为编译器.
我试过的图书馆:
vlint(操作不够,但对于小东西工作正常)
bigint(易于设置,编译错误和文档不多(可能从中导出错误))
ttmath(看起来很有前途,编译了一些BIG示例程序,并且由于编译错误而导致一些修复后运行,因为几乎没有文档,所以语法难以理解)
gmp(甚至无法设置)
ps删除了"问题的咆哮部分",基本上解释了为什么我在Stackoverflow上问了很多次问题,所以人们会把它读到最后.
- >更新
所以我选一个答案,这不是直接回答我最初的问题,但对我帮助很大,解决这一点,我会发布一些我的调查结果,以帮助其他的C++新手跟我一样开始使用非常大的数字,工作没有挣扎几天的图书馆像我一样一步一步地进行微观指导.
我正在使用的东西(请记住遵循指南):
Windows 7旗舰版x64
Amd k10 x64(有些库不适用于此,其他库的行为会有所不同,其他库会自定义为amd k10,因此这不仅可以帮助您使用我使用的库,还可以帮助您使用其他库)
Code :: Blocks 10.05包含MinGW的版本,文件名"codeblocks-10.05-setup.exe"(安装在C:\ Program Files(x86)\ CodeBlocks上)
MinGW包(binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2-20040916-1.tar.gz gcc-g ++ - 3.4.2-20040916-1.tar.gz mingw-runtime- 3.11.tar.gz w32api-3.8.tar.gz)在C:\ MinGW上提取
TTMath 0.9.2文件名"ttmath-0.9.2-src.tar.gz"解压缩并将文件夹"ttmath"复制到文件夹"C:\ CPPLibs"(这是我将我的c ++库放入的文件夹)
怎么做才能把它全部搞定
转到代码:Blocks> Settings> Compiler and Debugger(我的编译器在这里自动检测到.如果你没有这样做,请在"Selected Compiler"上选择"GNU GCC Compiler"并点击"Set as Default"然后点击"Toolchain" Exectables"on"编译器安装目录你可以选择编译器的安装目录或尝试自动检测"并在"C++编译器"上进行排序"选择或写入"mingw32-g ++.exe".如果发生这种情况,你只需要做在"Selected Compiler"中选择"GNU GCC Compiler"并单击"Set as Default").
在不离开"代码:块>设置>编译器和调试器"的情况下,按照上面的解决方法,转到"搜索目录",然后单击"添加",选择"存储库"或"放置"的位置. ttmath"文件夹(在我的情况下为C:\ CPPLibs)然后转到"链接器"并执行相同的操作.
首先,你必须把该行的"ttmath"编码库#include <ttmath/ttmath.h>的主要功能之前(注:如果您使用的是64位系统,你会得到很多的错误,如果你不还,就把这行#define TTMATH_DONT_USE_WCHAR 之前 …
我在一些在线论坛上看到了以下面试问题.对此有什么好的解决方案?
获取5 ^ 1234566789893943的最后1000位数字
如何比较的int用BigInteger在Java中?我特别需要知道a int是否小于a BigInteger.这是我正在使用的代码:
private static BigInteger two = new BigInteger("2");
private static BigInteger three = new BigInteger("3");
private static BigInteger zero = new BigInteger("0");
public static BigInteger bigIntSqRootCeil(BigInteger x) throws IllegalArgumentException {
if (x.compareTo(BigInteger.ZERO) < 0) {
throw new IllegalArgumentException("Negative argument.");
}
if (x == BigInteger.ZERO || x == BigInteger.ONE) {
return x;
}
BigInteger two = BigInteger.valueOf(2L);
BigInteger y;
for (y = x.divide(two);
y.compareTo(x.divide(y)) > 0;
y = ((x.divide(y)).add(y)).divide(two));
if (x.compareTo(y.multiply(y)) == 0) …Run Code Online (Sandbox Code Playgroud)