【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语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...
随机推荐
- Python实现数据库一键导出为Excel表格
依赖 Python2711 xlwt MySQLdb 数据库相关 连接 获取字段信息 获取数据 Excel基础 workbook sheet 案例 封装 封装之后 测试结果 总结 数据库数据导出为ex ...
- YCSB性能测试工具使用
在网上查In-Memory NoSQL性能测试的资料时,偶然间发现了这个性能测试工具YCSB,全称为"Yahoo! Cloud Serving Benchmark".它内置了对常见 ...
- ORACLE数据库管理常用查询语句
/*查看表空间的名称及大小*/ SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tabl ...
- 文件自动备份和同步bypy和syncthing
http://blog.csdn.net/pipisorry/article/details/52464402 Linux定时备份数据到百度云盘 sudo pip3 install requestss ...
- Android-满屏幕拖动的控件
本文转载自师兄一篇博客:http://blog.csdn.net/yayun0516/article/details/52254818 觉得跟之前的模拟小火箭很相似,又有学习的地方,能作为知识补充.所 ...
- FORM打开网页链接
DECLARE l_server_url VARCHAR2(100); l_parameters VARCHAR2(200); BEGIN fnd_profile.get('APPS_WEB_A ...
- 浅谈SSH框架
在学习或者接触一个新的概念的时候,我们应该在脑海中发挥我们的搜索引擎,牵一发动全身的去想,这个知识跟我之前接触过的有哪些相同或者不同的地方,从这个角度去看那些新的知识和概念,经过旧知识和新知识的对比我 ...
- 18 Loader 总结
1. Loader 装载器 Android3.0以后出来的 它可以使Activity和Fragment 异步加载数据 变得简单(Loader里封装了AsyncTask) Loader特点: 1,对每一 ...
- mysql数据库连接池使用(一)dbcp方式的配置
Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...
- SpringMVC系列之(一) 入门实例
Spring MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也 ...