自从我开始使用eclipse作为项目euler以来,我注意到大数字有时会变成看似随机的负数.我想这与传递类型的boudry有关.
如果你能向我解释这些负数是如何产生的,以及它背后的逻辑是什么,我将很高兴.另外,我怎样才能避免它们(最好不要使用BigInteger类).丹科!=)
目前,我使用的是有符号值,-2 ^ 63到2 ^ 63-1.现在我需要相同的范围(2*2 ^ 64),但只有正值.我发现java文档提到unsigned long,它适合这种用法.
我试图将2 ^ 64声明为一个Long包装器对象,但它仍然丢失了数据,换句话说,它只捕获到了Long.MAX_VALUE,所以我显然遗漏了一些东西.是BigInteger的签署久,Java支持?
是否有关于如何声明和使用它的定义或指针?
我试图在C++变量中放置一个大数字.号码是600851475143
我尝试了unsigned long long int但是错误地说它常量太大了.然后我尝试了一个名为BigInt的bigInt库 - > http://mattmccutchen.net/bigint/
问题是我无法编译代码,因为我收到很多关于lib的错误.
未定义的引用`BigInteger :: BigInteger(int)'< - 很多这些.
到目前为止,这是我的代码:
#include "string"
#include "iostream"
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;
int main() {
//unsigned long int num = 13195;
//unsigned long long int num = 600851475143;
BigInteger num = 13195;
int divider = 2;
//num = 600851475143;
while (1) {
if ((num % divider) == 0) {
cout << divider << '\n';
num /= divider;
} …Run Code Online (Sandbox Code Playgroud) 我想知道BigInt和其他类似的东西是如何实现的.我试图查看JAVA源代码,但它对我来说都是希腊语和拉丁语.你能用语言向我解释算法 - 没有代码,这样我就能理解当我使用JAVA API时我实际使用的内容.问候
我想知道是否有办法将BigInteger变量相乘,因为*运算符无法应用BigInteger.
所以我想知道是否可以在BigIntegers不使用*运算符的情况下将两个相乘.
SSE/AVX寄存器可以被视为整数或浮点BigNums.也就是说,人们可以忽视存在通道.是否有一种简单的方法可以利用这种观点并将这些寄存器单独或组合用作BigNum?我问,因为我从BigNum库中看到的很少,它们几乎普遍存储并对数组进行算术运算,而不是SSE/AVX寄存器.可移植性?
例:
假设您将SSE寄存器的内容存储为a中的键std::set,您可以将这些内容作为BigNum进行比较.
我在Rust中实现了Miller-Rabin Strong Pseudoprime测试,BigUint用于支持任意大质数.要通过5到10 ^ 6之间的数字,它需要大约40秒cargo run --release.
我用Java实现了相同的算法,BigInteger同样的测试需要10秒才能完成.Rust似乎慢了4倍.我认为这是由实施引起的num::bigint.
这只是当前的状态num::bigint,还是有人能发现我的代码有任何明显的改进?(主要是关于我如何使用该语言.无论我的算法实现是好还是坏,它在两种语言中的实现几乎完全相同 - 因此不会导致性能上的差异.)
我注意到clone()由于Rust的所有权模型,有很多需要,这可能会很快影响速度到某种程度.但我想没有办法解决这个问题,对不对?
这是代码:
extern crate rand;
extern crate num;
extern crate core;
extern crate time;
use std::time::{Duration};
use time::{now, Tm};
use rand::Rng;
use num::{Zero, One};
use num::bigint::{RandBigInt, BigUint, ToBigUint};
use num::traits::{ToPrimitive};
use num::integer::Integer;
use core::ops::{Add, Sub, Mul, Div, Rem, Shr};
fn find_r_and_d(i: BigUint) -> (u64, BigUint) {
let mut d = i;
let mut r = 0;
loop …Run Code Online (Sandbox Code Playgroud) 我在Rust中尝试了一个递归因子算法.我使用这个版本的编译器:
rustc 1.12.0 (3191fbae9 2016-09-23)
cargo 0.13.0-nightly (109cb7c 2016-08-19)
Run Code Online (Sandbox Code Playgroud)
码:
extern crate num_bigint;
extern crate num_traits;
use num_bigint::{BigUint, ToBigUint};
use num_traits::One;
fn factorial(num: u64) -> BigUint {
let current: BigUint = num.to_biguint().unwrap();
if num <= 1 {
return One::one();
}
return current * factorial(num - 1);
}
fn main() {
let num: u64 = 100000;
println!("Factorial {}! = {}", num, factorial(num))
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
$ cargo run
thread 'main' has overflowed its stack
fatal runtime error: stack overflow
error: Process didn't …Run Code Online (Sandbox Code Playgroud) 这是我迄今为止尝试过的。我想得到一个12.34:
BigInt('12340000000000000000') / BigInt('1000000000000000000')
12n
Number(BigInt('12340000000000000000') / BigInt('1000000000000000000'))
12
FWIW,当我使用 JSBI 库时,它的工作方式是我想要的:
JSBI.BigInt('12340000000000000000') / JSBI.BigInt('1000000000000000000');
12.34
这在本地是不可能的吗?
biginteger ×10
java ×3
rust ×2
avx ×1
bigint ×1
bignum ×1
c# ×1
c++ ×1
factorial ×1
javascript ×1
long-integer ×1
performance ×1
simd ×1
sse ×1
unsigned ×1