前言

基本分解质因数法

素数分解质因数法

Matlab2014a版分解质因数法

后记


前言

前面写过两篇关于素数相关的博客,一篇是关于如何判断素数,一篇是关于如何求取指定范围的素数集。参考百度百科,分解质因数就是是把一个合数分解成若干个质因数的乘积形式。可以看到分解质因数其实和质数还是关系的,因此萌发了写这篇博客的念头。

基本分解质因数法

该方法的基本思想就是找到分解后的质数,通过求余迭代实现。我在网上找到一个介绍该算法思路比较通俗的博文,传送门:分解质因数算法。代码如下:

public static int[] factor(int n){if(n < 0){throw new IllegalArgumentException("N must be a non negative integer.");}if(n < 4){return new int[]{n};}int factorNums = (int)(Math.log(Integer.highestOneBit(n)) / Math.log(2));int[] factors = new int[factorNums];int factorCount = 0;for(int i = 2; i <= (int) Math.sqrt(n); i++){if(n % i == 0){factors[factorCount++] = i;n /= i;i = 1;}}factors[factorCount++] = n;return Arrays.copyOf(factors, factorCount);
}

原理比较简单,具体参照我给的传送门。我主要说说那个factorNums值,它是个估计质因子数量的值。我们知道2是最小质数,因此如果一个数的质因子全是2,那么所有比它小的数,它们的质因子数一定会比它少。并且如果一个数据n在之间,那么它的质因数的长度绝对小于等于m,反证法很好证明,这里就不多说了。如果我要确定n的质因子数量,只需要计算出m值即可。首先求出这个数二进制的最高位的值p,即代码Integer.highestOneBit(n),然后通过计算出m,但是Java没有2为底的对数,只能用对数公式计算了。

素数分解质因数法

根据分解质因数的定义,可以知道,我们得到的结果全是素数,假设我们将√n前面所有素数全取出来,具体细节参考如何求取指定范围的素数集,然后一个一个求余,这样也能将所有质因子求出来。代码如下:

public static int[] factor(int n){if(n < 0){throw new IllegalArgumentException("N must be a non negative integer.");}if(n < 4){return new int[]{n};}int factorNums = (int)(Math.log(Integer.highestOneBit(n)) / Math.log(2));int[] factors = new int[factorNums];int factorCount = 0;int[] primes = primes((int) Math.sqrt(n));int primeNums = primes.length;for(int i = 0; i < primeNums; ){int prime = primes[i];if(n % prime == 0){factors[factorCount++] = prime;n /= prime;}else{i++;}}if(n != 1){ // N is a prime number.factors[factorCount++] = n;} factors = Arrays.copyOf(factors, factorCount);Arrays.sort(factors); // These prime numbers in array are in disorder.return factors;
}

Matlab2014a版分解质因数法

接下来介绍的是Matlab2014a版的factor方法,主要是给大家多提供点思路。

public static int[] factor(int n){if(n < 0){throw new IllegalArgumentException("N must be a non negative integer.");}if(n < 4){return new int[]{n};}int factorNums = (int)(Math.log(Integer.highestOneBit(n)) / Math.log(2));int[] factors = new int[factorNums];int factorCount = 0;int[] primes = primes((int) Math.sqrt(n));while(true){int primeProd = 1;for(int prime : primes){if(n % prime == 0){factors[factorCount++] = prime;primeProd *= prime;}}if(primeProd == 1){ // Now, n is a prime number.factors[factorCount++] = n;break;}if((n = n / primeProd) <= 1){break;}}    factors = Arrays.copyOf(factors, factorCount);Arrays.sort(factors); // These prime numbers in array are in disorder.return factors;
}

其实,第二种方法和这种方法原理相同,但看起来,第二种方法比这种方法效率要高。在Java平台上,可能的确如此,但是在Matlab平台下,这就不一定了,毕竟两者优化的侧重点不同。

后记

这两天终于把素数相关的东西学了点,虽然学的非常浅,连皮毛都不到,但代码写起来还是很舒服。一想到此时刻正是11月10日23:58分,别人的购物快乐,我却什么都没有,哎!!!

Java分解整型质因数相关推荐

  1. 深入理解Java的整型类型:如何实现2+2=5?

    先看下这段神奇的Java代码: public static void main(String[] args) throws Exception {doSomethingMagic();System.o ...

  2. [小技巧][JAVA][转换]整型int与字符char相互转换

    借助String.valueOf()过渡 char -> String ->int char c; String str = String.valueOf(c); int i = Inte ...

  3. java中将整型转换为字符型_JAVA的整型与字符串相互转换

    JAVA的整型与字符串相互转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Int ...

  4. java长整型时间转日期_C#长整型时间与java长整型时间转换

    最近在有一个解析并转发病毒软件日志的活,这个软件用的是SQLite嵌入式数据库存储病毒日志.查询病毒记录后,我发现它用长整型存储攻击时间这个字段,而且是一个10位的值.而我的解析系统是用C#写的,C# ...

  5. java 取整型的低八位_Java 基础(十五)并发工具包 concurrent

    本文目录: java.util.concurrent - Java 并发包简介 阻塞队列 BlockingQueue 数组阻塞队列 ArrayBlockingQueue 延迟队列 DelayQueue ...

  6. Java中整型的缓存机制

    本文将介绍Java中Integer的缓存相关知识.这是在Java 5中引入的一个有助于节省内存.提高性能的功能.首先看一个使用Integer的示例代码,从中学习其缓存行为.接着我们将为什么这么实现以及 ...

  7. java短整型_JAVA个基本数据类型

    Java有8大基本数据类型,分别是: 1).字节类型:byte Byte数据类型是8位 取值范围:(-128 - 127) 默认值:0 byte a= 100; byte b = -20; 2).短整 ...

  8. java短整型_Java的基本数据类型

    变量就是用来储存值而保留的内存位置.这就意味着当创建一个变量时就会在内存中占用一定的空间. 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中.因此,通过给变量分配不同的数据类 ...

  9. java长整型转换为整型_java ip地址转换为长整型

    java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...

最新文章

  1. 数据库及页面乱码问题
  2. 弹出popwindow 背景变暗
  3. NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V
  4. PAT甲级题目翻译+答案 AcWing(并查集)
  5. c语言for循环 wdtcn,MSP430F149的DS18B20C语言程序
  6. android的四种启动模式,(转)彻底弄懂Activity四大启动模式
  7. 光骓者的荣耀(洛谷P5638题题解,弃坑Java拥抱C++)
  8. Aptana studio 3汉化教程
  9. 鸿蒙 自研内核 core b,华为平板将首次搭载鸿蒙OS 2.0系统:首次自研内核与构架...
  10. gcc和arm-linux-gcc区别
  11. PAT 1089 狼人杀-简单版
  12. 十一种值得女生交往的男生
  13. 项目管理-Visio可以绘制甘特图编辑操作极方便
  14. Esp8266+ssd1306液晶屏+microPython
  15. canvas mdn_MDN文档 canvas教程笔记
  16. 【知识兔】自学Excel之1:了解Excel 中的基本功能
  17. 阿里云轻量级GPU计算型vgn6i云服务器配置性能详解
  18. 微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}
  19. 视频识别训练2.3(实现TensorFlow视频识别)
  20. 泰拉瑞亚服务器修改物品,泰拉瑞亚1.4自定义物品名称方法 自定义物品名称详细教程_逗游网...

热门文章

  1. java接口的的那些事1
  2. LR脚本录制3——Fiddler生成LR脚本(推荐)
  3. arcgis,裁剪投影不一致的矢量和栅格
  4. 游戏数学: 计算屏幕点中的平面上的点(上帝视角)
  5. 4K屏配置keil分辨率和图标大小
  6. Apache web服务器(LAMP架构)
  7. 微信聊天中上怎么用计算机,用电脑微信聊天会不会显示正在输入
  8. python 头条 sign 参数 此篇针对实时列表 请使用73版本的谷歌浏览器
  9. mysql CONCAT和DATE_ADD函数的使用
  10. android:声音合成之TTS