标签: biginteger

BigInteger:计算可伸缩方法中的小数位数

我需要计数a的小数位数BigInteger.例如:

  • 99 回报 2
  • 1234 回报 4
  • 9999 回报 4
  • 12345678901234567890 回报 20

我需要做的这一个BigInteger184948十进制数字多.我怎样才能快速,可扩展?

转换到字符串的方法是缓慢的:

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)

有没有更快的方法?

java biginteger

14
推荐指数
3
解决办法
1万
查看次数

Java中的高效BigInteger乘法模数

我可以计算两个BigIntegers(比如ab)模数n的乘法.

这可以通过以下方式完成:

a.multiply(b).mod(n);
Run Code Online (Sandbox Code Playgroud)

但是,假设ab具有相同的n阶,则意味着在计算过程中,正在计算新的BigInteger,并且其长度(以字节为单位)为~ 2n.

我想知道我是否可以使用更高效的实现.像modMultiply这样的东西像modPow一样实现(我相信它不会计算功率,然后是模数).

java math biginteger

14
推荐指数
1
解决办法
3047
查看次数

我应该使用什么数据结构来创建自己的"BigInteger"类?

作为一个可选的赋值,我正在考虑编写自己的BigInteger类实现,在那里我将提供自己的加法,减法,乘法等方法.

这将是任意长整数,甚至数百位长.

在对这些数字进行数学计算时,逐位数字并不难,您认为最好的数据结构代表我的"BigInteger"是什么?

起初我正在考虑使用一个数组,但后来我认为在一次大的加法或乘法之后我仍然可能会溢出(用完数组插槽).这是一个使用链表的好例子,因为我可以处理O(1)时间复杂度的数字?

是否有一些其他数据结构甚至比链表更适合?我的数据结构所保存的类型应该是我可用的最小可能整数类型吗?

另外,我应该小心如何存储我的"carry"变量?它本身应该是我的"BigInteger"类型吗?

c++ java biginteger data-structures

13
推荐指数
1
解决办法
3632
查看次数

从int值创建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)

还有其他(推荐)方法吗?

java biginteger

13
推荐指数
2
解决办法
2万
查看次数

在Perl模块中检查无穷大的最佳方法是什么?

在我的一个模块中,我必须处理无限的概念.到目前为止,我一直在使用9**9**9正无穷大,这似乎运作良好,速度快,似乎是perl的内部用作无限.

但是,如果我的模块的用户决定使用其中一个大数字模块(例如use bigint;),然后他们使用infMath::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 module biginteger bignum infinity

13
推荐指数
1
解决办法
659
查看次数

是否有可能在Perl中有条件地"使用bigint"?

我知道我可以在Perl中有条件地使用模块但是"pragma"呢?我的测试表明,use bigint在Perl 中可能比普通数学慢得多,我只需要它来处理64位整数,所以我只想在Perl没有用64位整数支持构建时使用它,我也知道如何检查是否使用该Config模块.

我尝试了各种各样的东西evalBEGIN块,但无法找到有条件使用bigint的方法.我知道我可以使用Math::BigInt但是我不能为bigint和64位情况使用单个代码路径.

perl conditional biginteger

13
推荐指数
3
解决办法
949
查看次数

如何在创建instantces后初始化BigInteger(无法调用构造函数)

想象一个实例BigInteger,然后在创建实例后如何初始化它?

例如:

BigInteger t = new BigInteger();
Run Code Online (Sandbox Code Playgroud)

如何投入价值t

如果无法调用构造函数,那么可以做什么,将值放在对象中?

java biginteger

13
推荐指数
2
解决办法
7万
查看次数

在C++中处理任意长度的整数

有人能告诉我一个好的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 之前 …

c++ numbers biginteger arbitrary-precision

13
推荐指数
1
解决办法
3689
查看次数

获取5 ^ 1234566789893943的最后1000位数字

我在一些在线论坛上看到了以下面试问题.对此有什么好的解决方案?

获取5 ^ 1234566789893943的最后1000位数字

algorithm biginteger modular-arithmetic

13
推荐指数
2
解决办法
626
查看次数

Java比较整数和bigInteger

如何比较的intBigInteger在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)

java biginteger bigint

13
推荐指数
2
解决办法
2万
查看次数