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 - 1for (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.mzph.cn/diannao/44351.shtml

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

相关文章

百问网全志D1h开发板MIPI屏适配

MIPI屏适配 100ASK-D1-H_DualDisplay-DevKit V11 1. 显示适配 1.1 修改设备树 1.1.1 修改内核设备树 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts: &lcd0 {lcd_used <1>;lcd…

Vue 项目中 history 路由模式的使用

在最近帮客户开发的一个项目中&#xff0c;由于项目的特殊性&#xff0c;需要用到 Vue 中的 history路由模式。该模式使用时会涉及到“上传白屏”和“刷新 404 问题”。在帮助客户解决这两个问题的过程中&#xff0c;总结问题的解决方案并记录下来&#xff0c;希望能够保留这篇…

眼外伤险失明辗转成都爱尔眼科就医保视力,患者复查送锦旗!

近日患者王先生到成都爱尔眼科医院进行硅油取出后的二次复查&#xff08;硅油为眼底病手术中一种“填充物”&#xff09;&#xff0c;他激动地为蔡裕主任献上锦旗&#xff0c;感谢医生的救治避免了失明。 意外发生在半年之前&#xff0c;王先生不慎滑倒右眼磕碰到茶几边缘&…

探索AI艺术的无限可能:SD模型与大模型的融合之美

艺术与科技的结合从未像今天这样紧密。AI绘画技术正以惊人的速度改变着我们创作和欣赏艺术的方式。在这场革命中&#xff0c;Stable Diffusion&#xff08;SD&#xff09;模型扮演了至关重要的角色。 &#x1f31f; SD模型&#xff1a;艺术创作的新维度 SD模型以其生成高质量图…

1.9-改进的CBOW模型的实现

文章目录 0引言1 CBOW模型的重构1.1模型初始化1.2模型的前向计算1.3模型的反向传播 2总结 0引言 前面讲述了对word2vec高速化的改进&#xff1a; 改进输入侧的计算&#xff0c;变成Embedding&#xff0c;即从权重矩阵中选取特定的行&#xff1b;改进输出侧的计算&#xff0c;包…

【C语言】【排序算法】----- 归并排序

由于最近要考试&#xff0c;好久没有发博客了&#xff0c;非常抱歉大家对我的支持。之后我会不断更新博客&#xff0c;继续创作出高质量的文章&#xff0c;希望能帮到大家&#xff01; 文章目录 一、归并排序基本思想二、递归实现三、非递归实现四、效率分析 一、归并排序基本…

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

关于原型和原型链的学习和实践

在前端面试中&#xff0c;原型和原型链始终是一个避不开的问题&#xff0c;今天就弄明白! 原型和原型链 对象的创建方式工厂模式构造函数模式原型模式 原型和原型链实践 对象的创建方式 原型和原型链都是关于对象的内容&#xff0c;先来看一下JavaScript中对象的构建方式。 工…

代码随想录(day3)有序数组的平方

暴力求解法&#xff1a; 注意&#xff1a;需要确定范围&#xff0c;比如nums.sort()是在for循环之外&#xff0c;根据函数的功能来确定 return返回的是nums&#xff0c;而不是nums[i]因为返回的是整个数组 class Solution(object):def sortedSquares(self, nums):for i in r…

人话学Python-基础篇-数字计算

一&#xff1a;数字类型 对于最常见的数据类型,数字在Python中分为三类&#xff1a; 整型(int) 表示的是整数类型的所有数字&#xff0c;包括正整数&#xff0c;负整数和0。和C语言不同的是&#xff0c;Python中的int型没有范围的限制&#xff0c;理论上可以从无限小的整数取到…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

数学建模国赛入门指南

文章目录 认识数学建模及国赛认识数学建模什么是数学建模&#xff1f;数学建模比赛 国赛参赛规则、评奖原则如何评省、国奖评奖规则如何才能获奖 国赛赛题分类及选题技巧国赛赛题特点赛题分类 国赛历年题型及优秀论文数学建模分工技巧数模必备软件数模资料文献数据收集资料收集…

白蛇插画:成都亚恒丰创教育科技有限公司

白蛇插画&#xff1a;古韵今风&#xff0c;情深意长 在浩瀚的艺术长河中&#xff0c;插画作为一种独特的艺术形式&#xff0c;以其生动形象的画面、丰富多彩的色彩和深邃悠远的意境&#xff0c;成都亚恒丰创教育科技有限公司深受人们喜爱。而“白蛇插画”&#xff0c;作为融合…

bug - while parsing file included at

bug 如下 找到这个对应文件tb_top.sv的对应行&#xff0c;发现是一个 include "inc_tb_tests_xxx.sv" 问题点&#xff1a;头文件&#xff0c;重复定义&#xff0c;那么 解决方法- 在被include的文件首尾加入 ifndef MY_TRANSACTION__SV define MY_TRANSACTION__SV …

GenAI 技术堆栈架构师指南 - 十种工具

这篇文章于 2024 年 6 月 3 日首次出现在 The New Stack 上。 我之前写过关于现代数据湖参考架构的文章&#xff0c;解决了每个企业面临的挑战——更多的数据、老化的Hadoop工具&#xff08;特别是HDFS&#xff09;以及对RESTful API&#xff08;S3&#xff09;和性能的更大需求…

前端--第一个前端程序

第一个前端程序 第一步&#xff1a; 使用记事本&#xff0c;编写代码 在你的一个磁盘里面创建一个文件夹&#xff0c;名为前端&#xff0c;然后在里面新建一个记事本&#xff0c;在里面写如下代码&#xff0c;注意一定要使用英文&#xff0c;然后把后缀名称改为.html。 第二…

你明白C++中的多态吗?(暑假提升-多态专题)

内不欺己&#xff0c;外不欺人。———孔子 有趣的多态 1、前言2、概念3、多态定义与产生条件4、多态的重要组成成员-(虚函数)5、虚函数的重写(覆盖)6、辅助关键字override与final(了解即可)7、重载&#xff0c;重定义(隐藏)&#xff0c;重写(覆盖)8、抽象类9、多态的原理9、1、…

PHP老照片修复文字识别图像去雾一键抠图微信小程序源码

&#x1f50d;解锁复古魅力&#xff0c;微信小程序黑科技大揭秘&#xff01;老照片修复&更多神奇功能等你来试&#xff01; &#x1f4f8; 【老照片修复&#xff0c;时光倒流的美颜术】 你是否珍藏着一堆泛黄的老照片&#xff0c;却因岁月侵蚀而模糊不清&#xff1f;现在…

实验02 黑盒测试(组合测试、场景法)

1. 组合测试用例设计技术 指出等价类划分法和边界值分析法通常假设输入变量相互独立&#xff0c;但实际情况中变量间可能存在关联。全面测试&#xff1a;覆盖所有输入变量的所有可能组合&#xff0c;测试用例数量随输入变量的增加而指数增长。 全面测试需要对所有输入的各个取…

2008年上半年软件设计师【上午题】真题及答案

文章目录 2008年上半年软件设计师上午题--真题2008年上半年软件设计师上午题--答案 2008年上半年软件设计师上午题–真题 2008年上半年软件设计师上午题–答案