【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语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...
随机推荐
- cassandra 并发技术介绍
摘要 本文主要介绍cassandra线程技术,cassandra的实现是基于java的,所以线程技术使用的也是jdk包提供的线程类.cassandra是分布式数据库,整个并发架构是基于阶段事件驱动架构 ...
- 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
Orbbec Astra Pro传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示 这款摄像头使用uvc输入彩色信息,需要libuvc和libuvc_ros这样才能在R ...
- list标准函数的模拟
;反序 ( ) -> ( ) (define (rvs x) (let recur ((x x)(res '())) (if (null? x) res (recur (cdr x) (cons ...
- Android自定义控件及自定义属性
Android自定义控件及自定义属性 自定义控件 创建自定义控件 自定义一个类,继承View 继承View还是哪个类,取决于你要实现一个什么样的控件 如果你要实现的是一个线性布局的组合控件,就可以继承 ...
- RxJava操作符(02-创建操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51645348 本文出自:[openXu的博客] 目录: Create Defer Empty ...
- RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533586 本文出自:[余志强的博客] 一.需求场景: 在开发Ap ...
- JQuery 网页选项卡制作
网页选项卡可以较好的利用有限的页面来展示更多的元素,而使用JQuery来制作网页选项卡也是一件非常简单的事情.今天就来分享一个网页选项卡的制作小技巧. 引入所需库 选项卡原理 业务核心 完整小例子 引 ...
- [ExtJS5学习笔记]第二十四节 Extjs5中表格gridpanel或者表单数据后台传输remoteFilter设置
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39667533 官方文档:http://docs.sencha.com/extjs/5. ...
- jQuery Ajax 使用 ($.ajax、$.post、$.get)
项目中只要涉及到前后台的交互,数据状态之间的交互,ajax是必不可少的.一般项目中jquery方式的ajax用的还是比较多的.封装的比较好,用起来也顺手,兼容浏览器之间的差异. 操作的方式有三种: 1 ...
- Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
File 类 用来将文件或者文件夹封装成对象 方便对文件与文件夹进行操作. File对象可以作为参数传递给流的构造函数 流只用操作数据,而封装数据的文件只能用File类 File类常见方法: 1.创建 ...