【Java编程】Java中的大整数计算

简介: 在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试。本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的BigInteger可以实现大整数的表示和计算。
    在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试。本来我准备用Java代码实现大整数的运算,查了一下资料发现Javajava.mathBigInteger可以实现大整数的表示和计算BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
下面通过程序来看看具体用法:
 
import java.math.BigInteger;


public class BigInt {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long x=123456789987654321L;
		long y=123456789999999L;
		System.out.println("x*y= "+(x*y));
		
		BigInteger bigX= new BigInteger("123456789987654321");
		BigInteger bigY= new BigInteger("123456789999999");
		
		BigInteger bigXY=bigX.multiply(bigY);
		System.out.println("bigXY= "+bigXY);
		
		boolean flag=false;
		BigInteger primenum=new BigInteger("18446744073709551557");
		flag=primenum.isProbablePrime(10);//参数10用于控制准确性
		//如果该调用返回 true,则此 BigInteger 是素数的概率超出 (1 - 1/2^10)。此方法的执行时间与此参数的值是成比例的。
		
		if(flag==true)
			System.out.println(primenum+"可能是素数!");
		else
			System.out.println(primenum+"肯定不是素数");
	}

}
结果显示如下:
x*y= -2700643659534631217
bigXY= 15241578995579818643499602345679
18446744073709551557可能是素数!
        通过结果我们可以看到,两个长整数相乘的结果超出了long型数据64位的表示范围,截断后的结果出现了负值。通过使用大整数类BigInteger很好的解决了这个问题。我们在前一篇文章中找到了64位的最大的可能素数是18446744073709551557 ,现在通过大整数类测试同样说明这个数是素数,这也间接说明前一篇算法实现的正确性。
附录:

int

getLowestSetBit() 返回此 BigInteger 最右端(最低位)1 比特的索引(即从此字节的右端开始到本字节中最右端 1 比特之间的 0 比特的位数)。

int

hashCode() 返回此 BigInteger 的哈希码。

int

intValue() 将此 BigInteger 转换为 int。

boolean

isProbablePrime(int certainty) 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。

long

longValue() 将此 BigInteger 转换为 long。

BigInteger

max(BigInteger val) 返回此 BigInteger 和 val 的最大值。

BigInteger

min(BigInteger val) 返回此 BigInteger 和 val 的最小值。

BigInteger

mod(BigInteger m) 返回其值为 (this mod m) 的 BigInteger。

BigInteger

modInverse(BigInteger m) 返回其值为 (this-1 mod m) 的 BigInteger。

BigInteger

modPow(BigInteger exponent, BigInteger m) 返回其值为 (thisexponent mod m) 的 BigInteger。

BigInteger

multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger。

BigInteger

negate() 返回其值是 (-this) 的 BigInteger。

BigInteger

nextProbablePrime() 返回大于此 BigInteger 的可能为素数的第一个整数。

BigInteger

not() 返回其值为 (~this) 的 BigInteger。

BigInteger

or(BigInteger val) 返回其值为 (this | val) 的 BigInteger。

BigInteger

pow(int exponent) 返回其值为 (thisexponent) 的 BigInteger。

static BigInteger

probablePrime(int bitLength, Random rnd) 返回有可能是素数的、具有指定长度的正 BigInteger。

BigInteger

remainder(BigInteger val) 返回其值为 (this % val) 的 BigInteger。

BigInteger

setBit(int n) 返回其值与设置了指定位的此 BigInteger 等效的 BigInteger。

BigInteger

shiftLeft(int n) 返回其值为 (this << n) 的 BigInteger。

BigInteger

shiftRight(int n) 返回其值为 (this >> n) 的 BigInteger。

int

signum() 返回此 BigInteger 的正负号函数。

BigInteger

subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger。

boolean

testBit(int n) 当且仅当设置了指定的位时,返回 true。

byte[]

toByteArray() 返回一个 byte 数组,该数组包含此 BigInteger 的二进制补码表示形式。

String

toString() 返回此 BigInteger 的十进制字符串表示形式。

String

toString(int radix) 返回此 BigInteger 的给定基数的字符串表示形式。

static BigInteger

valueOf(long val) 返回其值等于指定 long 的值的 BigInteger。

BigInteger

xor(BigInteger val) 返回其值为 (this ^ val) 的 BigInteger。

 

原文:http://blog.csdn.net/tengweitw/article/details/24177835

作者:nineheadedbird

目录
相关文章
|
1月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
8天前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
java中的常见运算符的计算方式
|
8天前
|
存储 JavaScript Java
如何在Java中计算绝对值
绝对值表示一个数离0的距离,总是非负的。在Java中,可以通过`Math.abs()`函数或`if-else`条件语句来计算绝对值。使用`Math.abs()`可直接将负数转为正数,而`if-else`则根据条件判断是否取反。本文介绍了这两种方法的具体实现步骤和代码示例,并展示了如何通过用户输入获取数值并输出其绝对值。此外,还提供了完整的代码和编译执行的方法。
如何在Java中计算绝对值
|
16天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
20天前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
54 12
|
16天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
99 2
|
2月前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
1月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
1月前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
52 3
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
55 4