当前位置: 首页 > news >正文

深圳场站建设发展有限公司百度搜索推广登录入口

深圳场站建设发展有限公司,百度搜索推广登录入口,湘潭做网站 磐石网络,东莞常平牙科一个常见的问题是确定数字的素因式分解。 蛮力方法是审判部门#xff08; 维基百科 #xff0c; 可汗学院 #xff09;#xff0c;但是如果必须考虑多个数字#xff0c;这需要大量的浪费工作。 一种广泛使用的解决方案是Eratosthenes筛#xff08; 维基百科 #xff0c… 一个常见的问题是确定数字的素因式分解。 蛮力方法是审判部门 维基百科 可汗学院 但是如果必须考虑多个数字这需要大量的浪费工作。 一种广泛使用的解决方案是Eratosthenes筛 维基百科 数学世界 。 容易修改Eratosthenes的筛网以使其包含每个复合数的最大素数。 这使得随后计算数字的素因式分解非常便宜。 如果我们只关心素数则可以使用带有Eratosthenes筛子的位图也可以使用Atkin筛子 。 旁注为清楚起见我忽略了素数始终为“ 1 mod 2n 2”和“ 1或5 mod 6n 5”这一事实所引起的常见优化。这可以大大减少筛子所需的内存量。 public enum SieveOfEratosthenes {SIEVE;private int[] sieve;private SieveOfEratosthenes() {// initialize with first million primes - 15485865// initialize with first 10k primes - 104729sieve initialize(104729);}/*** Initialize the sieve.*/private int[] initialize(int sieveSize) {long sqrt Math.round(Math.ceil(Math.sqrt(sieveSize)));long actualSieveSize (int) (sqrt * sqrt);// data is initialized to zeroint[] sieve new int[actualSieveSize];for (int x 2; x sqrt; x) {if (sieve[x] 0) {for (int y 2 * x; y actualSieveSize; y x) {sieve[y] x;}}}return sieve;}/*** Is this a prime number?** FIXME handle n sieve.length!* * param n* return true if prime* throws IllegalArgumentException* if negative number*/public boolean isPrime(int n) {if (n 0) {throw new IllegalArgumentException(value must be non-zero);}boolean isPrime sieve[n] 0;return isPrime;}/*** Factorize a number** FIXME handle n sieve.length!* * param n* return map of prime divisors (key) and exponent(value)* throws IllegalArgumentException* if negative number*/private MapInteger, Integer factorize(int n) {if (n 0) {throw new IllegalArgumentException(value must be non-zero);}final MapInteger, Integer factors new TreeMapInteger, Integer();for (int factor sieve[n]; factor 0; factor sieve[n]) {if (factors.containsKey(factor)) {factors.put(factor, 1 factors.get(factor));} else {factors.put(factor, 1);}n / factor;}// must add final termif (factors.containsKey(n)) {factors.put(n, 1 factors.get(n));} else {factors.put(n, 1);}return factors;}/*** Convert a factorization to a human-friendly string. The format is a* comma-delimited list where each element is either a prime number p (as* p), or the nth power of a prime number as p^n.* * param factors* factorization* return string representation of factorization.* throws IllegalArgumentException* if negative number*/public String toString(Map factors) {StringBuilder sb new StringBuilder(20);for (Map.Entry entry : factors.entrySet()) {sb.append(, );if (entry.getValue() 1) {sb.append(String.valueOf(entry.getKey()));} else {sb.append(String.valueOf(entry.getKey()));sb.append(^);sb.append(String.valueOf(entry.getValue()));}}return sb.substring(2);} } 该代码有一个主要弱点-如果请求的数字超出范围它将失败。 有一个简单的解决方法–我们可以根据需要动态调整筛子的大小。 我们使用Lock来确保多线程调用不会使筛选器处于中间状态。 我们需要注意避免在读锁和写锁之间陷入僵局。 private final ReadWriteLock lock new ReentrantReadWriteLock();/*** Initialize the sieve. This method is called when it is necessary to grow* the sieve.*/private void reinitialize(int n) {try {lock.writeLock().lock();// allocate 50% more than required to minimize thrashing.initialize((3 * n) / 2);} finally {lock.writeLock().unlock();}}/*** Is this a prime number?* * param n* return true if prime* throws IllegalArgumentException* if negative number*/public boolean isPrime(int n) {if (n 0) {throw new IllegalArgumentException(value must be non-zero);}if (n sieve.length) {reinitialize(n);}boolean isPrime false;try {lock.readLock().lock();isPrime sieve[n] 0;} finally {lock.readLock().unlock();}return isPrime;}/*** Factorize a number* * param n* return map of prime divisors (key) and exponent(value)* throws IllegalArgumentException* if negative number*/private MapInteger, Integer factorize(int n) {if (n 0) {throw new IllegalArgumentException(value must be non-zero);}final MapInteger, Integer factors new TreeMapInteger, Integer();try {if (n sieve.length) {reinitialize(n);}lock.readLock().lock();for (int factor sieve[n]; factor 0; factor sieve[n]) {if (factors.containsKey(factor)) {factors.put(factor, 1 factors.get(factor));} else {factors.put(factor, 1);}n / factor;}} finally {lock.readLock().unlock();}// must add final termif (factors.containsKey(n)) {factors.put(n, 1 factors.get(n));} else {factors.put(n, 1);}return factors;}Iterable Integer和foreach循环 在现实世界中使用foreach循环或显式Iterator通常比逐项探查表要容易得多。 幸运的是创建一个迭代器很容易该迭代器建立在我们的自增长筛子上。 /*** see java.util.List#get(int)** We can use a cache of the first few (1000? 10,000?) primes* for improved performance.** param n* return nth prime (starting with 2)* throws IllegalArgumentException* if negative number*/public Integer get(int n) {if (n 0) {throw new IllegalArgumentException(value must be non-zero);}IteratorInteger iter iterator();for (int i 0; i n; i) {iter.next();}return iter.next();}/*** see java.util.List#indexOf(java.lang.Object)*/public int indexOf(Integer n) {if (!isPrime(n)) {return -1;}int index 0;for (int i : sieve) {if (i n) {return index;}index;}return -1;}/*** see java.lang.Iterable#iterator()*/public IteratorInteger iterator() {return new EratosthenesListIterator();}public ListIteratorInteger listIterator() {return new EratosthenesListIterator();}/*** List iterator.** author Bear Giles bgilescoyotesong.com*/static class EratosthenesListIterator extends AbstractListIteratorInteger {int offset 2;/*** see com.invariantproperties.projecteuler.AbstractListIterator#getNext()*/Overrideprotected Integer getNext() {while (true) {offset;if (SIEVE.isPrime(offset)) {return offset;}}// well always find a value since we dynamically resize the sieve.}/*** see com.invariantproperties.projecteuler.AbstractListIterator#getPrevious()*/Overrideprotected Integer getPrevious() {while (offset 0) {offset--;if (SIEVE.isPrime(offset)) {return offset;}}// we only get here if something went horribly wrongthrow new NoSuchElementException();}} } 重要提示代码 for (int prime : SieveOfEratosthenes.SIEVE) { ... } 本质上是一个无限循环。 仅当JVM在分配新筛子时用完堆空间时它才会停止。 实际上这意味着我们可以在筛子中保持的最大质数约为1 GB。 这需要4 GB和4字节的整数。 如果我们只关心素数并使用常见的优化方法那么4 GB可以保存有关64 GB值的信息。 为简单起见我们可以将其称为9到10位数字以10为基数。 如果将筛子放在磁盘上怎么办 没有理由将筛子保留在内存中。 我们的迭代器可以从磁盘而不是内存缓存中安静地加载值。 一个4 TB的磁盘可能是在原始模式下访问的似乎将我们的筛子的大小提高到14到15位数字以10为基数。 实际上它会少一些因为我们必须将原始类型的大小从int到long增大一倍然后再可能是更大的格式。 更多 通过注意我们只需要计算sqrtn即可初始化n个值的筛子从而可以大大增加筛子的有效尺寸。 我们可以反过来说可以使用完全填充的n个值的筛子填充另一个n 2个值的筛子。 在这种情况下我们只希望填充一个波段而不是整个n 2筛。 现在我们的内存中筛子可以覆盖最多约40位数字的数字以10为基数而基于磁盘的筛子可以跳至60位数字的数字以10为基数减去较大值所需的空间。 没有理由不能进一步采用这种方法-使用小筛子来引导较大的瞬态筛子然后依次使用它来填充更大的筛子。 但是这需要多长时间 是的有摩擦。 初始化n个值的筛网的成本为On 2 。 您可以使用各种调整来减少常数但是到最后您要访问每个节点一次 On 然后访问与每个点成比例的与n成比例的滚动值。 值得一提的是保留CPU的缓存体系结构可能会产生很大的不同。 实际上任何最新的系统都应能够在几秒钟内创建一个包含前百万个素数的筛子。 将筛子激增到最初的十亿个素数如果JVM堆空间有限迫使我们大量使用磁盘那么时间可能会跳到一周甚至一个月。 我的直觉是填充TB磁盘需要花费数月甚至数年的服务器场时间 何必呢 对于我们大多数人来说主要的收获是演示了如何从一个小种子开始收集比如说一个n 1000的筛子并根据需要透明地进行生长。 对于素数这很容易但是想像一下RSS提要使用相同的方法并不是一件容易的事。 我们习惯于将Iterators视为Collections的一些乏味方面但实际上当用作Iterable的一部分时它们为我们提供了很多灵活性。 较大的主筛还有一个实际的原因-分解大量。 有多种很好的算法可以分解大量数据但是它们很昂贵-即使在服务器场中即使是“少量”数据也可能需要数月或数年。 这就是为什么第一步始终要使用“小”素数进行试验划分的原因-这可能需要一天的时间。 源代码 好消息是我已经为此发布了源代码……坏消息是当我处理Project Euler问题时这是正在进行的涂鸦的一部分。 这里没有解决方案-完全是对问题启发的想法的探索。因此代码有些粗略不应用于决定是否邀请我参加面试除非给您留下深刻的印象 http //github.com/beargiles/projecteuler。 翻译自: https://www.javacodegeeks.com/2014/07/getting-an-infinite-list-of-primes-in-java.html
http://www.zqtcl.cn/news/68110/

相关文章:

  • 织梦网站怎么做安全措施wordpress+整合js
  • 微网站需wordpress 文章内链插件
  • 网站建设招标模板没有网站备案可以做诚信认证嘛
  • wordpress做小说网站邯郸一堆网络科技
  • 班级网站建设需求分析制作公司官网多少钱
  • 阿里 网站建设怎样做当地网站推广
  • 广州做网站如何省级网站 开发建设 资质
  • 商业网站创建教程东莞大型企业
  • 做单位网站wordpress如何修改不用邮箱注册
  • 黑色装修网站源码dedewordpress主题 demo
  • 最简单的一个网站开发做网站 网上接单
  • 网站建设如何报价做电脑网站用什么软件好用
  • 苏州网站开发公司济南兴田德润厉害吗企业网站搜索引擎拓客
  • 淄博网站建设找卓迅网络强国建设的未来
  • 怎么做谷歌收录的网站网站制作方案和主要内容
  • 惠州网站制作案例企业系统开发去哪家
  • 企业网站建设推广含义批量发布文章到wordpress
  • 腾讯云点播做视频网站重庆如何做聚政网站
  • 网站rss生成协同办公软件下载
  • 学会网站制作要多久wordpress采集需要设置什么
  • iis发布网站乱码公司被其它人拿来做网站
  • 请勿直接解析到ip否则我司不能保证您的网站能正常运行!"对网站建设功能的情况说明
  • 安徽省建设厅网站域名山东临沂市建筑模板生产厂家
  • 在百度做网站赚钱吗超大型网站建设
  • 个人网站能 做淘客吗保定做网站百度推广
  • 传销公司做网站运营有专业做外贸的网站吗
  • 网站代理网站找资料的免费网站
  • 双鸭山网站建设公司治多县网站建设公司
  • 免费追剧网站大全淮北论坛官网app
  • 做交流网站网站开发平台开发公司