【算法】初等数论

初等数论

取余,遵循尽可能让商向0靠近的原则,结果的正负和左操作数相同

取模,遵循尽可能让商向负无穷靠近的原则,结果的正负和右操作数相同

7/(-3)=-2.3,产生了两个商-2和-3,取余语言中取-2,导致余数为1;取模语言中取-3,导致余数为-2

java中%是取余

1、暴力幂

思想:直接将a连续乘以b

时间复杂度:O(n)

空间复杂度:O(1)

    // 求 a^bpublic long pow(int a, int b){long ans = 1;for (int i = 0; i < b; i++) {ans *= a;}return ans;}

2、快速幂

思想:利用幂的2进制形式来加速运算。

时间复杂度:O(log₂N)

空间复杂度:O(1)

    // 求 a^bpublic long pow(int a, int b){long ans = 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans *= a;}// 将底数变为原底数的二次方a *= a;// 抛弃幂二进制形式的最后一位b >>= 1;}return ans;}

例子:

3 5 = 3 101 = 3 1 ∗ 2 3 + 0 ∗ 2 2 + 1 ∗ 2 0 = 3 1 ∗ 2 3 ∗ 3 0 ∗ 2 2 ∗ 3 1 ∗ 2 0 3^{5}=3^{101}=3^{1*2^{3}+0*2^{2}+1*2^{0}}=3^{1*2^{3}}*3^{0*2^{2}}*3^{1*2^{0}} 35=3101=3123+022+120=312330223120

3、Math类

// 求 a^b
// java.lang.Math
// double pow(double a, double b)
Math.pow(a, b)

可以支持浮点数的幂

补充

结果%c

原理:多个数的积%c,等于下列操作和的结果

  • 每个乘项%c
  • 最终积%c
    // 求 a^b%cpublic long pow(int a, int b, int c){long ans = 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans = (ans*a)%c;}// 将底数变为原底数的二次方a = (a*a)%c;// 抛弃幂二进制形式的最后一位b >>= 1;}return ans%c;}

对数

1、Math类

//java.lang.Math
double log(double a) //以e为底
double log10(double a) //以10为底Math.log(n);
Math.log10(n);

可以求浮点数的对数

2、朴素

    public static int logN(int base, int n) {int power = 0;while (n / base > 0) {n = n / base;power++;}return power;}//log2public int log2(int n) {int power = 0;while ((n = n >> 1) > 0) {power++;}return power;}

矩阵

1、单位矩阵

单位矩阵的对角线上的元素全为1,其他的元素全为0

	public int[][] unit(int n){int[][] res=new int[n][n];for(int i=0;i<n;i++){res[i][i]=1;}return res;}

2、乘法

	public int[][] multiplyMatrix(int x1[][],int x2[][]){//第一个矩阵的列必须等于第二个矩阵的行if(x1[0].length!=x2.length){return;}int lineLength=x1.length;   //第一个矩阵的行int listLength=x2[0].length;//第二个矩阵的列int[][] multiply=new int[lineLength][listLength];//相乘的结果矩阵for(int i=0;i<lineLength;i++){for(int j=0;j<listLength;j++){for(int k=0;k<x1[0].length;k++){multiply[i][j]+=x1[i][k]*x2[k][j];}}}return multiply;}

矩阵%c等于矩阵上的每一个元素都%c

3、快速幂

类似于整数的快速幂,不同的是1的表示(矩阵中为单位矩阵),以及乘法的定义

    // 求 a^bpublic int[][] pow(int[][] A, int b){int[][] ans = unit(A.length);// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans = multiplyMatrix(ans,a);}// 将底数变为原底数的二次方a = multiplyMatrix(a,a);// 抛弃幂二进制形式的最后一位b >>= 1;}return ans;}

素数(质数)

质数:是指在大于1的整数中,除了1和它本身以外不再有其他因数的自然数。

合数:是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。

1既不属于质数也不属于合数。最小的合数是4,最小的质数是2

1、朴素

boolean isPrime(int n){for(int i=2;i*i<=n;i++){if(n%i==0){return false;}}return true;
}

2、埃氏筛法

	//埃氏筛选法public void eratosthenes(int n) {boolean[] isPrime = new boolean[n+1];//false代表是素数,true代表的是合数for (int i = 0; i <= n; i++) {if(i<2){isPrime[i]=true;continue;}//如果是素数if (!isPrime[i]) {//将该素数的所有倍数都标记为合数for (int j = 2 * i; j < n; j += i) {isPrime[j] = true;}}}}

埃拉托斯特尼筛法(简称埃氏筛或爱氏筛):要得到自然数n以内的全部素数,必须把不大于 根号n 的所有素数的倍数剔除,剩下的就是素数。

时间复杂度:O(nloglogn)

不足之处:6 在 indexI = 2 时被标记,而在 indexI = 3 时,又被标记了一次。存在重复标记,有优化空间

3、欧拉筛

欧拉筛是对埃氏筛的改进,避免重筛,提高效率

	//欧拉筛选法public void euler(int n) {//建立一个bool类型的数组,以下标为要判断的数字 以该下标的值为素数的标志//若i是素数 则 isPrime[i]=falseboolean[] isPrime = new boolean[n+1];isPrime[0] = isPrime[1] = true;//数字0和1都不是素数,所以赋trueint[] Prime = new int[n+1];//存放素数的数组int t = 0;Prime[t++] = 2;//把2放进素数表for (int i = 2; i <= n; i++) {if (!isPrime[i])//若当前数是素数Prime[t++] = i;//则存入素数数组// 每一个数都去乘以当前素数表里面已有的数,如果 indexI 是合数,且 indexI % primeList[indexJ] == 0,那么它只能乘以第一个素数 2for (int j = 0; j < t && Prime[j] * i <= n; j++) {isPrime[i * Prime[j]] = true;// 保证了每个合数只会被它的最小素因子筛掉,避免重筛,使得程序更有效率if (i % Prime[j] == 0)break;}}}

欧拉筛法:保证每个合数只会被它的最小质因数筛掉,时间复杂度降低到O(n)。

每一个数都去乘以当前素数表里面 小于等于最小素因子的数

最大公因数(gcd)

最大公约数(Greatest Common Divisor)

1、辗转相除法(欧几里得)

思想:两个正整数a和b(a > b),它们的最大公约数gcd等于a除以b的余数r和b之间的最大公约数。辗转相除法的算法流程可以如下:

  1. 计算a与b的余数r。
  2. 如果r为0,则返回gcd = b。否则,转到步骤3。
  3. 使用b的值更新a的值,使用余数r更新b的值,转到步骤1。
int gcd(int x, int y) {return x == 0 ? y : gcd(y % x, x);
}int gcd(int a, int b){if (b == 0)return a;elsereturn gcd(b, a%b);
}int gcd(int a, int b){int temp;while(b!=0){temp=a%b;a=b;b=temp;}return a;
}

根本无需判断a和b的大小,当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来

2、更相减损术

思想:两个正整数a和b(a > b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。依次递归下去,直到两个数相等。这相等两个数的值就是所求最大公约数。

int gcd(int x, int y) {if (x==y)return x;else if (x>y)return gcd(x-y,y);else return gcd(y-x,x);
}

更相减损法和辗转相除法的思想较为接近,不同的是辗转相除法迭代更快,而更相减损法迭代慢。但后者使用的是减法,前者使用的是求余,前者损耗较低。在两数相差较大时避免使用更相减损法,而在大数是避免使用辗转相除法。

最小公倍数(lcm)

1、加穷举法

将大数依次乘N(N为从1开始的自然数),对得到的数判断其是否整除小数。

2、乘穷举法

将大数依次加1,对得到的数判断其是否可整除两数。

3、最大公因数法(最优)

l c m ( a , b ) = ∣ a ⋅ b ∣ g c d ( a , b ) lcm(a,b)=\frac{∣a⋅b∣}{gcd(a,b)} lcm(a,b)=gcd(a,b)ab

int lcm(int a, int b) {return a * b / gcd(a, b);
}

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

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

相关文章

TSMaster【第七篇:千机百变——面板设计艺术】

武侠场景导入&#xff1a;唐门暗器阁的启示 江湖传言&#xff0c;唐门暗器之所以独步天下&#xff0c;全凭其「千机匣」中七十二种机关变化。TSMaster面板设计恰似打造暗器机关——控件如同飞镖、机簧、毒针&#xff0c;组合方式不同则威力迥异。昔日某新势力车型因仪表盘刷新…

提升 AI 服务的稳定性:Higress AI 网关的降级功能介绍

在使用 LLM 服务时&#xff0c;服务的稳定性和可用性至关重要。然而&#xff0c;由于网络问题、服务器故障或其他不可控因素&#xff0c;LLM 服务可能会暂时不可用。为了保障用户体验和业务连续性&#xff0c;Higress AI 网关提供了强大的模型降级和令牌降级功能。本文将介绍这…

提升C++项目编译速度

目录 一、问题背景 二、代码规范方面的解决方案 2.1 拆分头文件 2.2 拆分巨型类 2.3 使用前置声明 2.4 避免在头文件中包含实现 2.5 避免头文件重复包含 2.6 将常用且变动较少的独立到一个文件 三、代码业务重构方面经验 3.1 使用PIMPL&#xff08;Pointer to Imple…

【学术投稿-第四届材料工程与应用力学国际学术会议(ICMEAAE 2025】材料工程与应用力学的探讨

重要信息 官网&#xff1a;www.icmeaae.com 时间&#xff1a;2025年3月7-9日 地点&#xff1a;中国西安 简介 第四届材料工程与应用力学&#xff08;ICMEAAE 2025&#xff09;将于2025年3月7日至9日在中国西安召开。本次会议将重点讨论材料科学、应用力学等领域的最新研究进…

抓包工具(三)Wireshark代理抓包Java程序的HTTPS请求

目录 一、需求背景二、操作步骤2.1 jSSLKeyLog 工具下载2.2 jSSLKeyLog工具使用2.3 将sslkeylog导入Wireshark2.4 测试Demo2.5 测试结果1&#xff09;使用工具解密HTTPS前&#xff1a;2&#xff09;实用工具解密HTTPS后&#xff1a; 三、补充&#xff1a;如果出现未解密成功的情…

[VSCode]彻底卸载和重装,并搭建Java开发环境

VSCode彻底卸载 由于当初是朋友帮忙装的&#xff0c;所以准备卸载,自己装一遍 从控制面板找到 vscode 将其卸载。 此时仅仅是删除了应用软件 删除安装插件 在图示路径中找到 .vscode 文件夹&#xff0c;将其删除&#xff0c;即可彻底清除安装的插件 C:\Users\user\.vscode …

泛微OA编写后端Rest接口

泛微OA编写后端Rest接口 前言 具体实现 运行结果 注意要点 总结 前言 在泛微E9中&#xff0c;可以通过注解的方式来编写对外的接口&#xff0c;之前的版本都是通过编写servlet类&#xff0c;然后在web.xml文件中将这个类和访问路径进行编辑之后才好在浏览器中通过输入对应…

041集——封装之:新建图层(CAD—C#二次开发入门)

如图所示&#xff1a;增加一个图层“新图层”&#xff0c;颜色为红&#xff08;1&#xff09;&#xff0c;当图层颜色定义为黄&#xff08;2&#xff09;时&#xff0c;直接覆盖之前图层颜色&#xff0c;图层名不变。 代码如下&#xff1a; /// </summary>/// <param …

Redis存储⑪主从复制_分布式系统解决单点问题

目录 1. 主从复制的概念 1.1 分布式解决单点问题 1.2 主从复制的特点 2. 模拟配置主从复制 2.1 建立复制 2.2 断开复制 2.3 安全性 2.4 只读 2.5 传输延迟 3. 主从复制的拓扑 3.1 一主一从结构 3.2 一主多从结构 3.3 树形主从结构 4. 主从复制的原理 4.1 复制过…

XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux

最近在研究个人用的小服务器&#xff0c;期间也搞了一台某讯的盒子&#xff0c;s905的芯片&#xff0c;28G&#xff0c;刷入了Armbian&#xff0c;在自己本地当linux服务器用用挺方便的&#xff0c;但总感觉性能不太够。 然后灵机一动&#xff0c;手上还有几台旧的安卓手机&am…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

HackTools插件+反弹shell的27种方法

前言 在渗透测试过程中&#xff0c;我们往往要使用很多命令&#xff0c;比如反弹shell、xss测试语句、sql测试语句、Linux常用提权语句、PowerShell常用语句。 为了方便&#xff0c;这里给大家推荐一个插件&#xff1a;HackTools&#xff0c;里面涵盖了渗透测试各种常用的语句…

Java语法-IO流

Java语法 Java基础语法 IO流 一、File类 /* java.io.File 文件类 提供了用于操作文件 创建文件 获取文件信息等 各种文件相关的方法 exists() 判断文件或目录是否存在 boolean isFile() 判断是否是文件 boolean isDirectory() 判断是否是目录 String getPath(…

Microsoft Office 2024 软件安装教程(免费)

1.通过百度网盘下载Microsoft Office 2024安装包 下载地址为: https://pan.baidu.com/s/1jk1kvQsKFH9dZGF5xfGgiQ?pwdjbkv 提取码: jbkv 。 2.安装环境 Win10~Win11或更高。 3.安装步骤 &#xff08;1&#xff09;下载压缩包&#xff0c;解压缩。 &#xff08;2&#xf…

鸿蒙NEXT应用App测试-专项测试(DevEco Testing)

注意&#xff1a;大家记得先学通用测试在学专项测试 鸿蒙NEXT应用App测试-通用测试-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注…

【学习笔记】【SpringCloud】MybatisPlus 基础使用

目录 一、使用 MybatisPlus 基本步骤 1. 引入 MybatisPlus 依赖 2. 定义Mapper接口并继承BaseMapper 二、MybatisPlus 常用配置 三、自定义SQL 四、IService 接口 1. 批量新增的效率问题 2. 配置方式 五、插件功能 1. 分页插件 一、使用 MybatisPlus 基本步骤 1. 引…

球队训练信息管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用&a…

使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用

目录 1 博主有话说2 前提环境3 Dify创建个聊天助手应用4 将AI聊天机器人嵌入到html中5 将AI聊天机器人设置为chrome的扩展应用6 博主增语 1 博主有话说 那博主话不多说&#xff0c;先展示一下成果&#xff01; 这个界面是使用dify配置的一个“聊天助手”的应用&#xff0c;助…

Oracle JDK、Open JDK zulu下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡

PiscTrace开发者版:只需考虑算法的视图处理应用

在计算机视觉领域&#xff0c;处理图像和视频数据的需求日益增长。无论是在智能监控、自动驾驶&#xff0c;还是工业检测中&#xff0c;图像处理都扮演着至关重要的角色。基于 OpenCV 的视图处理工具&#xff0c;专为需要高度定制和精确图像处理的开发者而设计。 一、CodeTrac…