欧拉函数性质和快速幂算法及python实现

news2024/9/21 17:50:50

目录

欧拉函数

快速幂算法

快速模幂算法


欧拉函数

两个不同的正整数a,b,若gcd(a,b)=1,则a和b互质,1与任何正整数都互质

欧拉函数的意义

φ(n) 表示小于或等于正整数n的所有正整数中与n互质的数的个数

φ(32) =16,即小于32的数中有16个与32互质的数,分别是

 1、3、5、7、9、11、13、15、17、19、21、23、25、27、29、31

任何正整数都可以表示成若干个素数的乘积,即写成如下形式

p表示素因子,k表示该素因子个数

欧拉函数的性质

(1)p 为素数,则有

φ(p)=p-1

(2)若mn 互质,则有

φ(mn)=φ(m)φ(n)

(3)分解公式

(4)n%m=0 \frac{n}{m}%m=0,则有

特殊地,令m=a^(b-1) n=a^b ,则可以得到

利用该定理可以用来求大指数的欧拉函数值

(5)若\frac{n}{m}和m互质,且m为素数 ,则有

(6)费马定理:若gcd(a,p)=1 ,则有

由分解公式求数a的欧拉函数值

​
pri = []  # 存储a的所有素因子
e = a
for i in range(2, int(e ** 0.5) + 1):  # int会下取整,所以最后加上1防止误差
    if e % i == 0:
        pri.append(i)
        while e % i == 0:  # 找到一个因子就用这个数一直除以该因子,消除该因子,保证后面找到的因子都是素因子
            e = e // i

if e != 1:  # 如果最后除出来结果不是1,说明还剩个素因数
    pri.append(e)

for p in pri:# 遍历a的所有素因子
    a = a // p * (p-1) 

print(a)#最后的a即为欧拉函数值

​

快速幂算法

a^n  其中n>0

以3^13为例,13的二进制为1101,因此3的13次方可以分解成以下形式:

将指数进行二进制分解,然后按二进制从右到左的顺序即倒回来遍历,如果二进制为1,则进行乘法运算,需要乘2^(i-1) i 表示第几位

由于1的二进制除了最低位是1,其他的全是0,因此可以利用n&1来判断n的二进制的最低位是否为1,如果n&1等于1,说明当前n的最低位是1,需要乘底数,反之n的最低位是0不用进行乘法,然后将n使用>>进行右移一位,产生新的最低位,直到n所有位数都移完,a在每次循环后都要进行平方更换为新底数

def fun(a, n):  # 底数,指数
    result = 1
    while n != 0:
        if (n & 1) == 1:
            result = result * a
        n = n >> 1
        a = a ** 2  # 将a重新赋值为a平方
    return result

直接使用暴力求幂的话时间复杂度为O(n),而使用快速模幂算法时间复杂度为O(log2⁡n)

快速模幂算法

模运算规则

其中b-1  b p 的逆元,在python可以用内置函数pow求逆元, pow(a,b,p) 表示a^b mod p

所以pow(a,-1,p) 就是a p 的逆元

也可以由费马定理求逆元:由费马定理b^(p-1) mod p=1 可得

求b^(p-2) mod p可以使用快速模逆算法,根据模运算的乘法法则,方法跟快速幂算法差不多,只不过多了模数

def fun(a, n, m):  # 底数,指数,模数
    result = 1
    while n != 0:
        if (n & 1) == 1:
            result = (result * a) % m
        n = n >> 1
        a = (a ** 2) % m  # 将a重新赋值为a平方
    return result

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

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

相关文章

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(8)模型训练

好吧,搞了半天,都是围绕数据在干活,这也就验证了,我们说的,数据准备等工作,要占到机器学习项目一半以上的工作量和时间。而且数据决定了模型的天花板,算法只是去达到上限。 我们今天来学习模型…

优秀实践| 运营商核心系统国产数据库迁移实践

作者介绍 陕西移动信息技术部 张云川 陕西移动信息技术部 王永强 新炬网络中北三部 张建 随着国家对自主可控战略的深入推进,笔者所在省份聚焦数据库国产化替换,全面加速数据库国产化替换进程。以核心系统带动周边系统,成功在能力运营中…

EasyRecovery易恢复16软件最新中文版本下载

一、主要功能与特点 EasyRecovery易恢复16是一款专业的数据恢复软件,其主要功能和特点包括: 全面的数据恢复:支持恢复因误删除、格式化、系统崩溃、病毒攻击等多种原因丢失的数据。深度扫描技术:对于严重损坏或格式化的存储设备…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis,一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中&#xf…

Flutter Engine 编译

本地环境 Flutter 开发基本环境配置,SDK【】 MAC. M2芯片 git工具 python环境[MAC自带] xcode Chromium depot_tools depot_tools 是调试 Flutter 引擎的必备工具包,包含了 gclient、gn 和 ninja 等工具,这些在下面会用到!…

洛谷P5738 歌唱比赛 题解

#题外话&#xff08;第37篇题解&#xff09;&#xff08;本题为普及-难度&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P5738 #思路&#xff08;好像和P5726-打分有点像&#xff0c;参考一下&#xff09; #代码 #include <bits/stdc.h> using na…

谈谈智能机器人智能电表运维管理体系在铁路牵引变电所建设构想

关键词&#xff1a;智能移动机器人状态检测分析决策智能化管理 0前言 牵引变电所是铁路机车供电的来源&#xff0c;是保障铁路运行的基本环节&#xff0c;经过多年的改造和发展&#xff0c;牵引变电所在我国大部分的铁路线路中已经得到了合理的覆盖&#xff0c;无人值班牵引变…

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…

VUE基础知识九 ElemrntUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

第二篇:CamX初认识(框架、代码结构介绍)

第二篇:CamX初认识 这篇文章分下面几点来展开: 1、CamX整体架构图; 2、CamX基本组件及其概念; 3、CamX代码目录结构; 4、CamX相关名词; 一、CamX整体架构图 目前Android主流的机型,采用高通芯片的,使用的基本都是camx架构。 之前旧的架构叫做mm-camera,camx架构…

【风格迁移】CAST:对比学习,从图像特征而非其二阶统计量(Gram矩阵)中学习风格

CAST&#xff1a;对比学习&#xff0c;从图像特征而非其二阶统计量&#xff08;Gram矩阵&#xff09;中学习风格 提出背景5 why 分析5 so分析 CAST 框架多层风格投影器领域增强模块生成网络 效果对比 StyleGAN 提出背景 论文&#xff1a;https://arxiv.org/pdf/2205.09542.pdf…

黑色金属冶炼5G智能工厂数字孪生可视化管控系统,推进金属冶炼行业数字化转型

黑色金属冶炼5G智能工厂数字孪生可视化管控系统&#xff0c;推进金属冶炼行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。金属冶炼行业作为传统工业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了推进金属冶炼行…

线段树学习笔记 下

可持久化线段树 上面两篇是几年前写的&#xff0c;笔者今日才加以整理&#xff0c;如有错误请见谅。 线段树加上版本就是可持久化线段树。 Problem Intro 给定一个数组&#xff0c;只需要单点修改和单点查询&#xff0c;但要维护版本。 具体说&#xff0c;每一次操作可能从…

Python算法100例-2.3 求车速

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1&#xff0e;问题描述 一辆以固定速度行驶的汽车&#xff0c;司机在上午10点看到里程表上的读数是一个对称数&#xff08;即这个数从左向右…

解决vscode每次git pull/push都需要输入账号密码

git如何设置用户名 邮箱 密码 //设置用户 git config --global user.name "xxx"//设置邮箱 git config --global user.email "xxxxxx.com"//设置密码 git config --global user.password "xxxxx"解决每次git pull/push操作都需要输入密码 git …

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &…

VMware虚拟机从一台电脑复制到另一台电脑

1 概述 在一台电脑上利用虚拟机安装了OS系统&#xff0c;特别是如果虚拟机中的系统进行了各种繁琐的配置&#xff0c;因为换电脑或者需要在其他电脑上配置&#xff0c;这个时候就可以将虚拟机中的系统复制拷贝一份到新电脑上&#xff0c;省时省力。 2 操作步骤 2.1 vmx文件 …

Mac OS 搭建C++开发环境【已解决】

Mac OS 搭建C开发环境 文章目录 Mac OS 搭建C开发环境一、安装命令行工具&#xff1a;二、安装vscode三、安装gcc3.1 安装Homebrew3.2 安装gcc3.3 修改配置 四、更改VSCode默认编译器五、安装gdb六、安装Cmake && git七、编译运行 本地环境&#xff1a; Mac OS Sonoma …

LabVIEW高效核磁测井仪器多线程优化

LabVIEW高效核磁测井仪器多线程优化 为提高核磁测井仪器的测试效率与性能&#xff0c;开发了基于LabVIEW的多线程优化模型。该研究针对传统的核磁测井仪器软件&#xff0c;在多任务调度测试和并行技术需求上存在的效率不高和资源利用率低的问题&#xff0c;提出了一个多线程优…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一 01.全排列02.子集03.找出所有子集的异或总和再求和04.全排列 II05.电话号码的字母组合 01.全排列 题目链接&#xff1a;https://leetcode.cn/problems/permutations/ 给定一个不含重复数字的数组 nums &#xff0c;返回其…