快速了解欧拉函数

本文详细介绍了欧拉函数的概念,包括完全剩余系和简化剩余系,以及欧拉函数的性质和计算方法。特别提到了线性筛法在计算欧拉函数中的应用,并给出了费马-欧拉定理及其推论。
摘要由CSDN通过智能技术生成

欧拉函数

要了解欧拉函数,首先得知道剩余系这一概念

完全剩余系

对于非0整数m,以m去除任意整数,可能得到的余数恰有0,1,..,m-1这m个数,这m个数我们就称为一个完全剩余系

简化剩余系

我们只保留完全剩余系中和m互质的数字,其余的删去,剩下的数字就是一个简化剩余系。

如12 , 它的简化剩余系就是1,5 , 7

如7,它的简化剩余系就是1,2,3,4,5,6

欧拉函数

我们把n的简化剩余系元素个数记为φ(n),称为欧拉函数。

欧拉函数的性质(不做证明)

欧拉函数是一个积性函数,故有如下结论:

设m = m1 * m2 ... *mk,m1,.....,mk两两互质,如此则

φ(m) = φ(m1) * φ(m2) *... *φ(mk)

欧拉函数的计算及证明

设n=p1^r1...pk^rk是n的质因数分解式,p1,...,pk 都不同,于是 φ(n) =n * (1 - 1/p1) * (1 - 1/p2) * ... *(1 - 1/pk)

证明:

n有三种情况

情况一:n为质数

则完全剩余系中和n互质的数有n - 1 = n * (1 - 1/n)个,满足上式

情况二:n = p ^ r

(任意整数有唯一质因子乘积表示)

在n的完全剩余系中,和n不互质的数有 p , 1 * p , 2 * p , ....,p^(r - 1) * p

故和p互质的数一共有p ^ r - p ^ (r - 1) = p ^ r * (1 - 1/p )个数字

满足上式

情况三:考虑一般情况 , n=p1^r1...pk^rk,p1,...,pk 都不同

前面提到过欧拉函数的性质

则φ(n) = φ(p1^r1) * ... * φ(pk ^ rk) = p1^r1(1 - 1/p1) ...pk^rk(1 - 1/pk)=n * (1 - 1/p1) * (1 - 1/p2) * ... *(1 - 1/pk)

满足上式

代码实现(C/C++)
int Euler(int n)
{
    int ans = n;
    for (int i = 2; i <= n / i; i++)//循环条件是因为大于sqrt(n)的质因数最多只有一个
    {
        if (!(n % i))
            ans = ans / i * (i - 1);
        while (!(n % i))
        {
            n /= i;
        }
    }
    //n如果此时大于1,则n为最后一个质因数
    if (n > 1)
        ans = ans / n * (n - 1);
    return ans;
}

线性筛法求欧拉函数

给出给定正整数n,求φ(1) + φ(2) + ... + φ(n),(我们认为1和1互质)

1 <= n <= 1e6

显然暴力枚举的时间复杂度不是我们想要的

这个时候就要联系到之前学过的欧拉筛,也就是线性筛法

这是我们线性筛法求素数的代码

关于线性筛的内容可以看博主另一篇博客素数筛 -- 埃氏筛 欧拉筛 详解-CSDN博客

const int  maxn = 1e7 + 10;
int primes[maxn + 1], cnt = 0;//0为素数 1为合数
int prime[maxn + 1];
inline bool isprime(int x)
{
    prime[2] = 0;
    for (int i = 2; i <= x; i++)
    {
        if (!prime[i])
            primes[cnt++] = i;
        for (int j = 0; j < cnt && primes[j] * i <= x; j++)
        {
            prime[primes[j] * i] = 1;
            if (i % primes[j] == 0)
                break;
        }
    }
    return !prime[x];
}

我们只需要在代码上稍加改进,

对于i,如果i是质数,那么φ(i) = i - 1,那么其他的数的欧拉函数值该如何去求呢?

我们的线性筛法之所以能求解出给定范围内的所有质数,就说明它把范围内的所有数字都筛了一遍

对于合数,我们应该在其被筛的地方根据我们已知的欧拉函数的性质来求出该合数的欧拉函数值

我们先给出结论

        if (i % primes[j] == 0)
        {
            phi[i * primes[j]] = primes[j] * phi[i];
            break;
        }
        else
        {
            phi[i * primes[j]] = (primes[j] - 1) * phi[i];
        }

对于else中的语句是最好理解的,我们知道欧拉函数的性质,此时primes[j]和i互质,那么由性质得出phi[i * primes[j]] = (primes[j]- 1) * phi[i];

但是对于if内的语句又是如何解释呢?

我们这得回到线性筛法的原理,我们保证每个合数被其最小质因数筛去

对于合数m = primes[j] * i

如果 i % primes[j] == 0,说明primes[j]也是i的因数,那么此时m的质因数和我们i的质因数相同了,这也就是我们线性筛在此处break能保证合数能被其最小质因数筛去

那么这个时候的欧拉函数值是什么呢?

根据公式有 phi[primes[j] * i] = primes[j] * i * (1 - 1/p1) ...(1 - 1/pk) = primes[j] * phi[i],(因为m和i质因数一样)

这就是递推的由来

完整代码如下:

const int maxn = 1e6 + 7;
int primes[maxn + 1], cnt = 0; // 0为素数 1为合数
bitset<maxn> isprime;
vector<int> phi(maxn + 1);
inline void Euler_Phi(int x)
{
    isprime[2] = 0;
    phi[1] = 1;
    for (int i = 2; i <= x; i++)
    {
        if (!isprime[i])
        {
            primes[cnt++] = i;
            phi[i] = i - 1;
        }
​
        for (int j = 0; j < cnt && primes[j] * i <= x; j++)
        {
            isprime[primes[j] * i] = 1;
            if (i % primes[j] == 0)
            {
                phi[i * primes[j]] = primes[j] * phi[i];
                break;
            }
            else
            {
                phi[i * primes[j]] = (primes[j] - 1) * phi[i];
            }
        }
    }
}

费马-欧拉定理

若a和n互质,则

a^φ(n) ≡ 1 (mod n)

若n=p是一个质数,则φ(n) =p-1,故得如下推论.

推论:费马小定理I

若p 是质数而p卜a,则

a ^ (p - 1) ≡ 1 (mod p)

费马小定理常常被表示成另一种形式,也是经常用到的.

推论 费马小定理II

若p为质数,则对任意整数a都有

a ^ p ≡ p (mod p)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 欧拉伯努利梁是一种常用的结构力学理论模型,可以用于分析和设计梁的应力和变形。有限元方法是一种数值计算方法,用于解决结构力学问题。在Matlab中,可以使用有限元编程来实现欧拉伯努利梁的分析和计算。 首先,需要定义梁的几何形状和材料参数。可以使用Matlab的变量来表示梁的长度、截面形状、弹性模量等参数。然后,可以根据定义的几何形状和材料参数,构建梁的刚度矩阵和荷载向量。这一步可以使用Matlab的矩阵操作和数值计算函数来实现。 接下来,需要确定梁的边界条件。边界条件包括悬臂梁、简支梁或固定梁等不同的支座类型。可以使用Matlab的边界条件函数来实现这一步。 然后,可以使用有限元方法来求解梁的位移和应力。有限元方法将梁离散为多个小单元,每个单元都可以使用欧拉伯努利梁模型进行分析。可以使用Matlab的循环和矩阵操作来实现有限元离散和数值计算。 最后,可以对计算结果进行后处理和可视化。可以使用Matlab的绘图函数来显示梁的变形和应力分布图。 总之,欧拉伯努利梁的有限元编程可以在Matlab中实现,通过定义几何形状和材料参数、构建刚度矩阵和荷载向量、确定边界条件、应用有限元方法求解、进行后处理和可视化,可以分析和设计各种梁结构的力学性能。 ### 回答2: 欧拉-伯努利梁理论是描述梁的弯曲和挠度行为的一种理论模型,而有限元方法是数值计算中解决复杂结构问题的一种常用方法。在MATLAB中使用有限元方法进行欧拉-伯努利梁模型的编程可以实现对梁的应力、挠度和位移等参数的精确计算。 在MATLAB中,编程欧拉-伯努利梁模型需要首先定义梁的几何形状和材料属性。几何形状包括梁的长度、宽度和高度等,材料属性则包括梁的弹性模量和截面惯性矩等。然后,将梁离散成有限个单元,通过有限元法建立整个梁的模型。 接下来,在MATLAB中构建单元刚度矩阵,该矩阵描述了梁单元的刚度特性,并考虑了材料的弹性模量和几何形状。然后,根据梁模型的边界条件,构造整个梁系统的刚度矩阵和载荷向量。 最后,通过求解梁模型的整体刚度方程组,可以得到梁的应力、挠度和位移等参数的数值解。这些参数可以用来评估梁的结构性能和进行进一步的设计和分析。 编程欧拉-伯努利梁模型的过程需要掌握MATLAB的矩阵操作和数值计算技巧,并且需要对梁理论和有限元方法有一定的了解。有限元编程可以通过增加节点和单元的数量来提高计算精度,同时也会增加计算的复杂度和计算时间。 总之,MATLAB有限元编程可以用于欧拉-伯努利梁模型的数值计算,通过该方法可以快速准确地获取梁的主要结构参数。它在工程设计和结构分析中有着重要的应用。 ### 回答3: 欧拉伯努利梁是一种用于分析梁的弯曲和振动特性的数学模型。而MATLAB是一款功能强大的科学计算软件,可以用于实现有限元编程。 有限元方法是一种常用的工程分析方法,用于计算复杂的结构系统。在欧拉伯努利梁的有限元编程中,首先需要确定梁的几何形状和边界条件。然后,将梁划分为有限个节点和单元,并为每个节点和单元分配适当的编号。 接下来,可以通过计算单元的刚度矩阵和质量矩阵来获取系统的刚度矩阵和质量矩阵。这些矩阵包含了梁材料的性质、几何信息和边界条件等参数。然后,利用这些矩阵可以解出梁在给定边界条件下的振动特性。 在MATLAB中,可以使用矩阵运算和线性代数函数来实现梁的有限元编程。可以定义合适的函数和变量来存储梁的几何信息、材料属性和边界条件。使用循环结构可以逐个计算节点和单元的刚度矩阵和质量矩阵,并将其组装成整个系统的刚度矩阵和质量矩阵。 最后,可以通过求解特征值问题来得到梁的固有频率和振型。可以使用内置的求解函数或手动实现特征值求解算法。得到固有频率后,可以进一步分析梁在给定载荷条件下的响应。 总之,欧拉伯努利梁的有限元编程需要使用MATLAB进行数值计算和矩阵操作,通过分解和求解矩阵方程来求解梁的振动特性。这种编程方法可以应用于不同类型梁的分析,对于工程实践和学术研究都具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQUINOX1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值