Java实战:寻找完美数

文章目录

  • 一、何谓完美数
  • 二、寻找完美数
    • (一)编程思路
    • (二)编写程序
    • (三)运行程序
  • 三、实战小结

一、何谓完美数

  • 完美数是一种特殊的自然数,它等于其所有正除数(不包括其本身)之和。完美数非常稀有,并且只存在于偶数中。第一个完美数是 6 6 6,其除数 1 1 1 2 2 2 3 3 3的和等于它本身。完美数与梅森素数紧密相关,如果 2 p − 1 2^p - 1 2p1是梅森素数,那么 2 p − 1 ( 2 p − 1 ) 2^{p-1}(2^p - 1) 2p1(2p1)就是完美数。古希腊数学家欧几里得首次描述了完美数,但直到现代,已知的完美数仍然不多。寻找完美数是数论中一个古老而深奥的问题,至今仍在数学研究中占有一席之地。随着数值的增大,发现新的完美数变得越来越困难,需要高效的算法和强大的计算资源。
  • 6 = 1 + 2 + 3 6 = 1 + 2 + 3 6=1+2+3是最小的完美数,不仅如此, 6 = 1 × 2 × 3 6 = 1 \times 2 \times 3 6=1×2×3,《圣经》开篇《创世纪》里提到,上帝用6天的时间创造了世界(第 7 7 7天是休息日),而相信地心说的古希腊人认为,月亮围绕地球旋转所需的时间是 28 28 28天(即便在哥白尼的眼里,太阳系也恰好有 6 6 6颗行星)。古罗马思想家圣奥古斯都在《上帝之城》中写道:“ 6 6 6这个数本身就是完美的,并非因为上帝造物用了 6 6 6天;事实上,恰恰因为 6 6 6是完美的,所以上帝在 6 6 6天之内把一切事物都造好了。”
  • 迄今为止( 2024 2024 2024 7 7 7 9 9 9日),人们只发现51个偶完美数,没有人找到一个奇完美数,也没有人能够否定它的存在。不难证明,偶完美数均以数字 6 6 6 8 8 8结尾。古希腊人曾猜测它们交替以 6 6 6 8 8 8结尾,后来被证实是错误的。统计已有的完美数,以 8 8 8结尾的和以 6 6 6结尾的完美数分别是 19 19 19个和 32 32 32个,这个比值趋近于黄金分割比!有意思的是,黄金分割恰好也是毕达哥拉斯学派提出来的,只是他们当初没想过其与完美数之间可能存在某种联系。
  • 所谓黄金分割比是指把一条线段分割成两部分,使其中一部分与全长之比等于另一部分与这部分之比,其比值是 5 − 1 2 ≈ 0.618 \displaystyle\frac{\sqrt{5}-1}{2}≈0.618 25 10.618…按此比例设计的造型特别美丽,被称为黄金分割。这个数值不仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,也在管理、工程设计等方面有重要的应用,在日常生活中的应用也比比皆是。

二、寻找完美数

(一)编程思路

  1. 理解完美数与梅森素数的关系:完美数是形式为 2 p − 1 ( 2 p − 1 ) 2^{p-1}(2^p - 1) 2p1(2p1)的数,其中 2 p − 1 2^p - 1 2p1必须是梅森素数。

  2. 实现Lucas-Lehmer素性测试:这是检测梅森素数的一种有效方法。对于每个 p p p,计算序列直到 p − 2 p-2 p2项,如果最终结果为 0 0 0,则 2 p − 1 2^p - 1 2p1是素数。

  3. 寻找梅森素数:从 p = 2 p=2 p=2开始,对每个 p p p调用lucasLehmerPrime函数,检查 2 p − 1 2^p - 1 2p1是否为素数。

  4. 计算并输出完美数:一旦找到梅森素数,根据完美数的公式计算相应的完美数,并输出结果。

  5. 设置搜索限制:程序将持续寻找并输出完美数,直到找到大于预设限制的数为止。

  6. 优化与考虑:对于大数计算,使用BigInteger类处理可能的溢出问题。同时,考虑到计算量可能非常大,实际应用中可能需要进一步优化算法或使用并行计算。

  7. 代码实现:将上述思路转化为Java代码,使用BigInteger类进行大数运算,实现完美数的搜索程序。

(二)编写程序

  • net.huawei.number包里创建PerfectNumberFinder
    在这里插入图片描述
package net.huawei.number;

import java.math.BigInteger;

/**
 * 功能:完美数寻找器
 * 作者:华卫
 * 日期:2024年07月09日
 */
public class PerfectNumberFinder {

    public static void main(String[] args) {
        // 设置寻找完美数的上限
        findPerfectNumbers(new BigInteger("1000000000000000000000000000000000000000000000000000000000000000000000000000"));
    }

    /**
     * 执行Lucas-Lehmer素性测试来检查2^p - 1是否为梅森素数。
     *
     * @param p 用于计算2^p - 1的指数
     * @return 如果2^p - 1是素数,则返回true,否则返回false
     */
    public static boolean lucasLehmerPrime(int p) {
        if (p == 2) {
            return true; // 2^2 - 1是最小的梅森素数
        }
        BigInteger s = BigInteger.valueOf(4); // 初始值
        BigInteger M = BigInteger.ONE.shiftLeft(p).subtract(BigInteger.ONE); // 计算2^p - 1
        for (int i = 0; i < p - 2; i++) {
            // 应用Lucas-Lehmer迭代过程
            s = s.multiply(s).subtract(BigInteger.valueOf(2)).mod(M);
        }
        return s.equals(BigInteger.ZERO); // 如果s为0,则2^p - 1是素数
    }

    /**
     * 寻找并打印所有小于给定限制的完美数
     *
     * @param limit 完美数搜索的上限值
     */
    public static void findPerfectNumbers(BigInteger limit) {
        int p = 2; // 从最小的梅森素数候选指数开始
        int count = 0;
        while (true) {
            if (lucasLehmerPrime(p)) {
                // 如果找到梅森素数,计算相应的完美数
                BigInteger mersennePrime = BigInteger.ONE.shiftLeft(p).subtract(BigInteger.ONE);
                BigInteger perfectNumber = BigInteger.ONE.shiftLeft(p - 1).multiply(mersennePrime);
                // 统计找到的完美数数量
                count++;
                // 打印梅森素数和对应的完美数
                System.out.println("梅森素数: " + mersennePrime);
                System.out.println("完 美 数: " + perfectNumber);
                // 如果完美数大于给定限制,则停止搜索
                if (perfectNumber.compareTo(limit) > 0) {
                    break;
                }
            }
            p++; // 移动到下一个候选指数
        }
        System.out.println("找到" + count + "个完美数~");
    }
}

(三)运行程序

  • 查看结果,在指定范围内找到12个完美数
    在这里插入图片描述

三、实战小结

  • 通过编写和运行完美数寻找器程序,我们深入理解了完美数与梅森素数的内在联系,体验了大数计算的挑战,并认识到了算法优化的重要性。此过程不仅锻炼了编程技能,还激发了我们对数论奥秘的探索兴趣。尽管寻找大完美数极具难度,但使用BigInteger类和Lucas-Lehmer测试,我们能够有效地识别梅森素数,进而发现新的完美数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/786759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法——同步算法

在力扣有这样一道题求交集&#xff0c;与此类似的还有求差集&#xff0c;相关的解法有很多。我这里提供一种思路&#xff1a;利用C的容器set对这两个数组去重&#xff0c;遍历数组插入set即可去重。再同时遍历比较set的每个元素。 代码实现很简单&#xff0c;如下所示&#xff…

《mysql篇》--索引事务

索引 索引的介绍 索引是帮助MySQL高效获取数据的数据结构&#xff0c;是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针&#xff0c;因为索引本身也比较大&#xff0c;所以索引一般是存储在磁盘上的&#xff0c;索引的种类有很多&#xff0c;不过如果没有特殊…

人工智能AI安全认证,我推荐CAISP认证!

在人工智能AI越来越火热的时代&#xff0c;AI信息安全认证已经成为热门职业&#xff0c;是众多知名企业众星捧月的人才&#xff01; 成为高级AI安全专业官&#xff0c;认准CAISP人工智能安全专家认证&#xff01; 课程概述&#xff1a; 生成式人工智能、大模型等人工智能技术…

VBA实现Excel的数据透视表

前言 本节会介绍通过VBA的PivotCaches.Create方法实现Excel创建新的数据透视表、修改原有的数据透视表的数据源以及刷新数据透视表内容。 本节测试内容以下表信息为例 1、创建数据透视表 语法&#xff1a;PivotCaches.Create(SourceType, [SourceData], [Version]) 说明&am…

文章SameStr(三):图3代码

“Publication Figure 3” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(ggridges) library(grid) # library(Hmisc) …

国产鸿道Intewel操作系统与Codesys高实时虚拟化运动控制解决方案

随着运控行业的快速发展&#xff0c;实时与非实时业务的融合应用需求日益增长。例如在机器视觉处理领域&#xff0c;无论是在Windows还是Linux平台上&#xff0c;传统实时操作系统无法与非实时操作系统如Windows或Linux兼容&#xff0c;不能充分利用Windows或者Linux系统的生态…

CC7利用链分析

分析版本 Commons Collections 3.2.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 CC7,6,5都是在CC1 LazyMap利用链(引用)的基础上。 只是进入到LazyMap链的入口链不同。 CC7这个链有点绕&#xff0c;下面顺着分析一下利用链。 入口类是Hashtable&…

Java面试八股之MySQL索引B+树、全文索引、哈希索引

MySQL索引B树、全文索引、哈希索引 注意&#xff1a;B树中B不是代表二叉树&#xff08;binary&#xff09;&#xff0c;而是代表平衡&#xff08;balance&#xff09;&#xff0c;因为B树是从最早的平衡二叉树演化而来&#xff0c;但是B树不是一个二叉树。 B树的高度一般在2~…

java之循环练习题

思路分析&#xff1a; 代码&#xff1a; public static void main(String[] args) {int sum0;for (int i1;i<100;i){for (int j1;j<i;j) {sum j;}}System.out.println(sum);} 结果为&#xff1a;

量子保密通信协议原理:量子保密通信实验

纸上得来终觉浅&#xff0c;绝知此事要躬行。 在之前的文章中&#xff0c;我们对量子密钥分发协议原理、分发过程进行了详细的描述&#xff0c;今天我们实操一波。博主向大家隆重介绍一下华中师范大学量子保密通信虚拟仿真试验平台&#xff1a;量子保密通信是将量子密钥分发和一…

数字化时代下,财务共享数据分析建设之路

随着人工智能、云计算、大数据、区块链等技术&#xff0c;以及衍生出的各种产品的大发展&#xff0c;使得数字化发展的速度再一次加快&#xff0c;也让数字经济和数字化转型得到了更多人的关注和认可。 在传统经济增长逐渐放缓&#xff0c;市场竞争愈发激烈的局面下&#xff0…

3D模型进入可快速编辑时代,51建模网赋能Web3D展示!

丰富多样的Web3D展示形式&#xff0c;离不开强大的3D互动引擎作为坚实后盾。51建模网依托WebGL技术的先进力量&#xff0c;匠心打造了一款在线3D模型编辑器&#xff0c;它不仅能够迅速优化3D模型效果&#xff0c;更能够生成引人入胜的3D互动内容&#xff0c;让创意无界&#xf…

Linux 系统 CPU 100% 异常问题,能否用一个 Shell 脚本完美解决?

昨天下午突然收到运维邮件报警&#xff0c;显示数据平台服务器cpu利用率达到了98.94%&#xff0c;而且最近一段时间一直持续在70%以上&#xff0c;看起来像是硬件资源到瓶颈需要扩容了&#xff0c;但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用&#x…

uniapp本地打包到Android Studio生成APK文件

&#xff08;1&#xff09;安装 Android Studio 软件&#xff1b; 下载地址&#xff1a;官方下载地址&#xff0c;英文环境 安装&#xff1a;如下之外&#xff0c;其他一键 next &#xff08;2&#xff09;配置java环境&#xff1b; 下载&#xff1a;j…

第一次坐火车/高铁,如何坐?全流程讲解

第一次坐动车注意事项 第一次乘动车流程&#xff1a;进站→安检→候车厅→找检票口→过闸机→站台候车→找车厢→上车找座→下车→出站 乘车流程 一、进火车站/高铁站&#xff1a;刷购票证件原件进站 1、自助闸机刷证&#xff1a;身份证 2、人工通道&#xff1a;护照、临时…

AFT:Attention Free Transformer论文笔记

原文链接 2105.14103 (arxiv.org) 原文翻译 Abstract 我们介绍了 Attention Free Transformer (AFT)&#xff0c;这是 Transformer [1] 的有效变体&#xff0c;它消除了点积自注意力的需要。在 AFT 层&#xff0c;键key和值value首先与一组学习的位置偏差position biases相结…

九、Linux二进制安装ElasticSearch集群

目录 九、Linux二进制安装ElasticSearch集群1 下载2 安装前准备(单机&#xff0c;集群每台机器都需要配置)3 ElasticSearch单机&#xff08;7.16.2&#xff09;4 ElasticSearch集群&#xff08;8.14.2&#xff09;4.1 解压文件&#xff08;先将下载文件放到/opt下&#xff09;4…

语义言语流畅性的功能连接和有效连接

摘要 语义言语流畅性(SVF)受损在多种神经系统疾病中都存在。虽然已经报道了SVF相关区域的激活情况&#xff0c;但这些区域如何相互连接以及它们在脑网络中的功能作用仍存在分歧。本研究使用功能磁共振成像评估了健康被试SVF静态和动态功能连接(FC)以及有效连接。观察到额下回(…

js替换对象内部的对象名称或属性名称-(第一篇)

方案一&#xff1a;对于值为undefined null 的对象属性不考虑该方案 JSON.parse(JSON.stringify(data).replace(/name/g, new_name)) //data为数组&#xff0c;name为修改前&#xff0c;new_name为修改后 解释&#xff1a;1&#xff09;JSON.stringify()把json对象转成json字…

3GPP R18 Multi-USIM 是怎么回事?(三)

这篇内容相对来说都是一些死规定,比较枯燥。主要是与MUSIM feature相关的mobility and periodic registration和service request触发过程的一些规定,两部分的内容是有部分重叠的,为保证完整性,重复部分也从24.501中摘了出来。 24.501 4.25 网络和MUSIM UE可以支持MUSIM fe…