我正在使用java并且必须处理大于long的数字(64位).我该怎么用?java中BigInteger的大小是多少?
我将这一行从C++移植到C#,我不是一个经验丰富的C++程序员:
unsigned int nSize = BN_num_bytes(this);
Run Code Online (Sandbox Code Playgroud)
在.NET中,我使用的是System.Numerics.BigInteger
BigInteger num = originalBigNumber;
byte[] numAsBytes = num.ToByteArray();
uint compactBitsRepresentation = 0;
uint size2 = (uint)numAsBytes.Length;
Run Code Online (Sandbox Code Playgroud)
我认为它们在内部运作方式存在根本区别,因为如果BigInt等于:来源的单元测试结果不匹配:
我完全不知道BN_num_bytes(编辑:评论只是告诉我它是BN_num_bits的一个宏).
题
你会验证这些关于代码的猜测:
我需要移植BN_num_bytes哪个宏((BN_num_bits(bn)+7)/8)(谢谢@WhozCraig)
我需要移植BN_num_bits哪个floor(log2(w))+1
然后,如果存在不计算前导和尾随字节的可能性,那么Big/Little端机器上会发生什么?有关系吗?
基于Security.StackExchange上的这些答案,以及我的应用程序对性能不重要,我可能会使用.NET中的默认实现,而不是使用可能已经实现类似解决方法的备用库.
编辑:到目前为止,我的实现看起来像这样,但我不确定评论中提到的"LookupTable"是什么.
private static int BN_num_bytes(byte[] numAsBytes)
{
int bits = BN_num_bits(numAsBytes);
return (bits + 7) / 8;
}
private static int BN_num_bits(byte[] numAsBytes)
{
var log2 …Run Code Online (Sandbox Code Playgroud) 我需要将一个非常大的二进制值转换为十进制等值.因为它是一个大整数我使用BigInteger.那么如何将这个二进制数转换为BigInteger呢?
我正在研究CPU繁重的数值计算应用程序.没有进入很多细节,它是一个计算数学研究项目,涉及为大整数x计算某个函数f(x).
现在,所有内容都是在x64模式下使用C++实现的,使用本机64位整数.这限制了我x <2 ^ 64~1.8*10 ^ 19.我想更进一步,为此,我需要一个执行128位算术的库.它必须非常快.特别是,整数除法应该很快.否则我会坐在这里等待结果直到感恩节.而且我宁愿不重新发明轮子.
我在维基百科上找到了一个大约20个大整数库的列表,但其中大多数似乎都是针对任意精度的数字,这对我的任务来说太过分了,我不需要额外的费用.
有谁知道哪个库可以最快地运行128位整数?
如何在java中添加任意长度的两个数字?
比如说,在java中长度是64位.所以,最大范围-9223372036854775808到9223372036854775807是吗?
因此,如果我们想要添加一个比下面更大的数字,我得到一个错误
"整数太大"
长a = 9223372036854775807L;
长b = 9223372036854775808L;
在C中,我们可以把这些数字作为字符数组,通过各字符的地址遍历,并使用一些数据结构,我们可以添加任意大小的两个数字.
怎么做java.我们可以遍历String中每个字符的地址.
谢谢你的回复.
我试图通过将数字作为字符串传递并从末尾添加每个字符来进行编码.这对我来说可以.
有添加使用BigInteger和方法2个非常大的数字之间的任何大的差异,我上面指定(从临时变量端和存储剩余添加每个字符和变亮).BigInteger的基础机制是否与我的代码相同(从末尾添加每个字符)?
谢谢.
我正在尝试解决编程竞赛的初步问题以及我必须计算的两个问题,并打印一些非常大的整数(如100!,2 ^ 100).
我还需要一种快速计算这个大整数的能力的方法.
你可以为我建议一些算法或数据结构吗?(顺便说一下,我读过C接口和实现的'任意精度算术'部分,但它对pow()没有帮助)
编辑:我认为通过平方法和位移的取幂对功率起作用,但我还需要一种快速的方法来计算这个因子的阶乘.谢谢.
EDIT2:对于那些感兴趣的人;
找到包含长度为N的所有位串的最短位串长度(对不起我的英文,我举一个例子).N <= 10000
例如,包括长度为2(00,01,10,11)的所有比特串的最短比特串长度是5(11001).
我对这个问题的解决方案是2 ^ n + n - 1.(所以我应该计算2的幂,我想我会使用位移)
其他问题是,给定2个长度,找到你可以通过多少种方式达到长度N.例如,输入是10,2,3.那么你应该用2和3达到10(例如,2 + 3) 2 + 2 + 2 + 2,2 + 2 + 3 + 3,3 + 2 + 2 + 3,3 + 3 + 2 + 2 ......).1 <= N <2 ^ 63.我们将在mod 1000000007中计算anwser.
我的解决方案是,2x + 3y = N,所以x =(N - 3y)/ 2.对于从0到2*N/3的y,如果x是一个整数,那么我应该计算这个X和Y的广义置换,总计+ =(x + y)!/(x!*y!).
我正在使用BigIntegers进行计算,它使用一个调用multiply()大约1000亿次的循环,而BigInteger创建的新对象使得它非常慢.我希望有人写过或找到了一个MutableBigInteger类.我在java.math包中找到了MutableBigInteger,但它是私有的,当我将代码复制到一个新类时,会出现很多错误,其中大部分都是我不知道如何修复的.
像MutableBigInteger这样的Java类有哪些实现允许修改值?
我正在尝试编写一个Java程序来计算大数的阶乘.似乎BigInteger无法容纳这么大的数字.
以下是我写的(直截了当的)代码.
public static BigInteger getFactorial(BigInteger num) {
if (num.intValue() == 0) return BigInteger.valueOf(1);
if (num.intValue() == 1) return BigInteger.valueOf(1);
return num.multiply(getFactorial(num.subtract(BigInteger.valueOf(1))));
}
Run Code Online (Sandbox Code Playgroud)
上述程序在5022中处理的最大数量,之后程序抛出一个StackOverflowError.有没有其他方法来处理它?
我正在寻找一个很好的基础BigInt类在C++中,我发现很多实现,但大多数时候,它是加密库的复杂实现...
基本上,我的意思是BigInt可以处理BigInt,long long和带有运算符重载的字符串.如果我有时间,我已经完成了自己,但我没有时间创建一个完整的BigInt类.
这是我的发件人实体
@Entity
public class Sender {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long senderId;
...
...
public long getSenderId() {
return senderId;
}
public void setSenderId(long senderId) {
this.senderId = senderId;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试执行以下查询时:
StringBuilder query = new StringBuilder();
query.append("Select sender.* ");
query.append("From sender ");
query.append("INNER JOIN coupledsender_subscriber ");
query.append("ON coupledsender_subscriber.Sender_senderId = sender.SenderId ");
query.append("WHERE coupledsender_subscriber.Subscriber_subscriberId = ? ");
SQLQuery q = (SQLQuery) sessionFactory.getCurrentSession().createSQLQuery(query.toString());
q.setResultTransformer(Transformers.aliasToBean(Sender.class));
q.setLong(0, subscriberId);
return q.list();
Run Code Online (Sandbox Code Playgroud)
发生以下错误:
错误:org.hibernate.property.BasicPropertyAccessor - HHH000123:类中的IllegalArgumentException:be.gimme.persistence.entities.Sender,属性的setter方法:senderId
错误:org.hibernate.property.BasicPropertyAccessor - HHH000091:预期类型:long,实际值:java.math.BigInteger
这是因为类Sender中的senderId实际上是一个long而不是BigInteger(由Hibernate返回).
我想知道在这样的情况下最佳做法是什么,我应该使用BigIntegers作为id(看起来有点矫枉过正)?
我应该手动将查询结果转换为类Sender的对象(那会很糟糕)?或者我可以让Hibernate返回longid而不是 …