【Java编程】Java中的大整数计算
在上一篇文章中,我们实现了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中的大整数计算的更多相关文章
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
- JAVA编程思想中总结的与C++的区别
Java和C++都是面向对象语言.也就是说,它们都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象 ...
- java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);
大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...
- POJ C++程序设计 编程题#1 大整数的加减乘除
编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- 深入剖析Java编程中的中文问题及建议最优解决方法
摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...
- java 编程时候的性能调优
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java编程性能优化
1尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资 ...
- Java编程性能优化一
转自:http://my.oschina.net/xianggao/blog/77224 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...
随机推荐
- Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤
Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤 运行测试环境:数据库服务器Oracle Linux 5.8 + Oracle 11g R2数据库 ...
- Android开发之Path类使用详解,自绘各种各样的图形!
玩过自定义View的小伙伴都知道,在View的绘制过程中,有一个类叫做Path,Path可以帮助我们实现很多自定义形状的View,特别是配合xfermode属性来使用的时候.OK,那我们今天就来看看P ...
- Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》
转载本专栏文章,请注明出处尊重原创:博客地址http://blog.csdn.net/qq_32059827/article/details/52849676:小杨的博客 许多应用可能需要加入进度,例 ...
- FORM中读取图片
1.创建ITEM 重要属性如下 item属性:图像 大小样式:调整 数据库项:否 2.读取触发器 在block级别,创建trigger READ_IMAGE_FILE('D:\'||:XX_EMOLY ...
- Android Demo 下拉刷新+加载更多+滑动删除
小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第 ...
- java内存垃圾回收模型
一.java的内存模型 介绍如下6个组成部分 1.程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是N ...
- 步步为营---- MuleEsb学习(一) 扫盲篇
本篇文章是基于不断的接触GXPT之后,对其技术开始不断的积累学习^^^,有很多问题带给我了思考,对于如何的处理各个部分的流程?这个如何处理?太多的问题促使着我一步一步的学习,在师哥们的指导下,逐步的清 ...
- (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇博文介绍了物理对象中小球与砖块的碰撞处理,在这一篇中我们再 ...
- android PakageManagerService启动流程分析
PakageManagerService的启动流程图 1.PakageManagerService概述 PakageManagerService是android系统中一个核心的服务,它负责系统中Pac ...
- Java中数组的扩容
在写程序的过程中,我们常常会碰见数组空间不够用的情况,比如我已经初始化了一个数组int []a = {1,2,3,4,5,6,7,8,9,10} ;这时,我想往数组下标3的位置插入一个元素,该怎么做? ...