在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试。本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的BigInteger可以实现大整数的表示和计算。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

【Java编程】Java中的大整数计算的更多相关文章

  1. Java编程思想中关于闭包的一个例子

    Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...

  2. JAVA编程思想中总结的与C++的区别

    Java和C++都是面向对象语言.也就是说,它们都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象 ...

  3. java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);

    大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...

  4. POJ C++程序设计 编程题#1 大整数的加减乘除

    编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

  5. 【老鸟学算法】大整数乘法——算法思想及java实现

    算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...

  6. 深入剖析Java编程中的中文问题及建议最优解决方法

    摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...

  7. java 编程时候的性能调优

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  8. Java编程性能优化

    1尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资 ...

  9. Java编程性能优化一

    转自:http://my.oschina.net/xianggao/blog/77224 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

随机推荐

  1. spark下使用submit提交任务后报jar包已存在错误

    使用spark submit进行任务提交,离线跑数据,提交后的一段时间内可以application可以正常运行.过了一段时间后,就抛出以下错误: org.apache.spark.SparkExcep ...

  2. 【Netty源码学习】DefaultChannelPipeline(三)

    上一篇博客中[Netty源码学习]ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具 ...

  3. Android初级教程:如何自定义一个状态选择器

    有这样一种场景:点击一下某个按钮或者图片(view),改变了样式(一般改变背景颜色).这个时候一种解决方案,可能就是状态选择器.接下来就介绍如何实现状态选择器: 步骤: 一.新建这样的文件夹:res/ ...

  4. [ExtJS5学习笔记]第十六节 Extjs5使用panel新增的ViewModel属性绑定数据

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39078627 sencha官方API:http://docs.sencha.com/e ...

  5. java异常体系结构详解

    前几天在参加网易和360公司的在线考试的时候,都出了一道关于java中异常类的多项选择题.这几天翻看了相关书籍和网上一些资料,结合自己的理解与思考,将自己的一些收获记录如下: 先来看看java中异常的 ...

  6. SVN关于忽略xcuserdata目录

    SVN关于忽略xcuserdata目录,以iPhone Qzone工程为例Xcode工程,xcuserdata目录一般位于blur.xcodeproj目录下面,eg:jonesduan-MacBook ...

  7. Android简易实战教程--第四话《最简单的短信发送器》

    首先配置一个布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  8. 网站开发进阶(四十三)html中,路径前加“/” 与不加“/”的区别

    网站开发进阶(四十三)html中,路径前加"/" 与不加"/"的区别 前言 <script src="js/downloadify.js&quo ...

  9. Android的图片,字符串,demin,color,以及Array,boolean,Integer资源的使用-android学习之旅(五十四)

    总体介绍 颜色值的定义 定义字符串,颜色,尺寸资源 字符串 颜色资源 尺寸资源 使用字符串,颜色,尺寸资源 boolean的定义与使用 整形常量的定义与使用 数组资源的定义与使用 图片资源的使用

  10. [Python]django使用多进程连接msyql错误

    问题 mysql 查询出现错误 error: (2014, "Commands out of sync; you can't run this command now") 查询 m ...