Java实战:寻找完美数

news2024/9/23 3:22:24

文章目录

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

一、何谓完美数

  • 完美数是一种特殊的自然数,它等于其所有正除数(不包括其本身)之和。完美数非常稀有,并且只存在于偶数中。第一个完美数是 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测试,我们能够有效地识别梅森素数,进而发现新的完美数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【好物推荐】2024年最佳无线耳塞和耳机

深入三星生态系统找到最适合使用的三星无线耳塞和耳机。 如果你有一部三星手机&#xff0c;你可以很容易地从市场上最好的无线耳机中选择。有与airpods相当的Galaxy Buds Pro 2&#xff0c;或者大量与Android兼容的第三方选项。其中许多还支持aptX或LDAC音频编解码器&#xff…

Python 利用pandas处理CSV文件(DataFrame的基础用法)

前面介绍过通过Python标准库中的CSV模块处理CSV文件&#xff1a; Python 利用CSV模块处理数据 相比CSV模块&#xff0c;pandas的功能更加强大&#xff0c;本文将简单介绍如何通过pandas来处理CSV文件。 文章目录 一、pandas简介二、用法示例2.1 读取CSV文件2.1.1 read_csv参数…

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

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

【问题记录】Windows中Node的express无法直接识别

问题描述 在使用express_generator的时候windows平台中出现无法识别express命令的问题&#xff0c;另外就算添加了全局环境变量也没用。 问题解决 查看官方文档发现在node版本8之前的时候使用的是express&#xff0c;但是之后的版本使用npx&#xff0c;这个工具的出现主要想…

数字身份管理发展趋势:IAM 和数据安全相结合

数据安全和IAM作为网络安全领域中不同的学科而存在。然而&#xff0c;随着越来越多的组织利用云服务&#xff0c;情况发生了显著的转变。许多公司现在将重要的安全控制(例如管理存储、应用程序和网络的控制)委托给他们选择的云服务提供商(CSP)。 图&#xff1a;用户与云服务商职…

C++ QT实现验证码功能

codearea.h #ifndef RENDERAREA_H #define RENDERAREA_H#include <QList> #include <QPainterPath> #include <QRect> #include <QWidget>#define DEF_CODECOUNT 4 // 验证码默认位数#define DEF_NOISYPOINTCOUNT 60 // 噪点数量 #define DEF_C…

印尼“支付宝” DANA 如何借力 OceanBase 实现3个“关键零”

当前&#xff0c;移动支付在东南亚正迅猛发展&#xff0c;据谷歌、淡马锡与贝恩公司发布的报告预测&#xff0c;东盟地区蓬勃兴起的移动支付市场有望在2030年突破至2万亿美元的交易规模。 在此背景下&#xff0c;DANA作为印尼——东南亚最大经济体中的一员&#xff0c;秉持着推…

【docker 把系统盘空间耗没了!】windows11 更改 ubuntu 子系统存储位置

系统&#xff1a;win11 ubuntu 22 子系统&#xff0c;docker 出现问题&#xff1a;系统盘突然没空间了&#xff0c;一片红 经过排查&#xff0c;发现 AppData\Local\packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\ 这个文件夹竟然有 90GB 下面提供解决办法 步…

磁力搜索引擎是什么?为什么有些资源喜欢用磁力链接?

磁力链接是什么东西&#xff1f;在日常生活中&#xff0c;我们接触的比较多的下载链接是直链。 所谓的直链简单来说就是直接指向服务器文件资源的链接&#xff0c;如B站app的下载链接&#xff0c;这种链接有统一的服务器提供保障&#xff0c;通常比较稳定&#xff0c;可以追溯源…

数据结构 —— Dijkstra算法

数据结构 —— Dijkstra算法 Dijkstra算法划分集合模拟过程打印路径 在上次的博客中&#xff0c;我们解决了使用最小的边让各个顶点连通&#xff08;最小生成树&#xff09; 这次我们要解决的问题是现在有一个图&#xff0c;我们要找到一条路&#xff0c;使得从一个顶点到另一个…

java之数组练习

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {char[] arrnew char[26];for (char i0;i<arr.length;i ){arr[i] (char) (Ai);}System.out.println(arr);} 结果&#xff1a;

VMware使用技巧

目录 1. 系统快照 1.1 拍摄快照 1.2 查看快照 1.3 应用/删除快照 2. 克隆虚拟机 3. 删除虚拟机 1. 系统快照 1.1 拍摄快照 将当前系统的状态保存下来&#xff0c;如果将来系统出现不可修复的故障&#xff0c;使用快照可以恢复操作系统&#xff1b; CentOS7——拍照—…

【STM32】MDK的编译过程及文件类型全解

1.编译过程简介 编译&#xff1a;MDK软件使用的编译器是armcc和armasm&#xff0c; 它们根据每个c/c和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code&#xff0c;也称目标文件)&#xff0c; 其内容主要是从源文件编译得到的机器码&#xff0c;包含了代码、数据…

Object方法重写

这篇文章大家随意看看就好&#xff0c;只是一点理解的东西&#xff0c;当然你也可以认真调查。 我们需要知道Obecj是java中的一个类&#xff0c;是所有类的父类&#xff0c;即超类。对&#xff0c;超级赛亚人的那个超。 我们需要关注其中的equals、tostring这两个方法。 例如&…

汇川Easy系列PLC使用本地脉冲5轴设置

根据官网手册可以看到&#xff0c;Easy302往上的系列都是支持本地5轴脉冲控制的 常规汇川PLC本地脉冲轴配置时&#xff0c;脉冲和方向的输出点都是成对出现的&#xff0c;但是easy如果要使用5轴的话&#xff0c;就需要自己定义方向 可以看到&#xff0c;Y0,Y1这两个点是单独…

接口测试课程结构

课程大纲 如图&#xff0c;接下来的阶段课程&#xff0c;依次专项讲解如下专题&#xff0c;能力级别为中级&#xff0c;进阶后基本为中高级&#xff1a; 1.接口基础知识&#xff1b; 2.抓包工具&#xff1b; 3.接口工具&#xff1b; 4.mock服务搭建&#xff08;数据模拟服务&am…

国产PLC能否使用无线通讯终端来实现无线通讯?让我们一探究竟

在工业生产车间内&#xff0c;PLC被广泛应用于自动化控制的各个环节。随着智能化工厂的建设&#xff0c;许多PLC仍处于信息孤岛状态&#xff0c;现要将厂区内分散的PLC都建立通讯&#xff0c;如果重新布线工厂量大且不美观&#xff0c;此时就需要用到工业PLC无线通讯设备来解决…

Presto报错:[Presto requires an Oracle or OpenJDK JVM (found Red Hat, Inc.)]

启动前: 已经搭建了jdk环境hadoop的jdk环境配置没有问题 启动Presto时&#xff0c;报错 解决方案: 可能是presto自身变量配置没生效在presto路径下找到bin目录, 进入启动脚本launcher 在 exec "$(dirname “ 0 " ) / l a u n c h e r . p y " " 0"…

守护舌尖安全,破解EHS管理难题,食品加工企业的可持续发展之路

在当今社会&#xff0c;食品安全与环境保护已成为全球关注的热点&#xff0c;食品加工企业作为连接农业与消费者的关键环节&#xff0c;其环境、健康与安全&#xff08;EHS&#xff09;管理水平直接关系到产品的质量和企业的可持续发展。然而&#xff0c;食品加工企业在EHS管理…

面壁智能发布端侧 AI 应用开发平台;快手推出肖像动画技术 LivePortrait丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…