数论及其应用——积性函数问题
Posted 黑大帅之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论及其应用——积性函数问题相关的知识,希望对你有一定的参考价值。
在学习快速幂的过程中,我们曾遇到过因子和函数σ(n),曾提及该函数是积性函数,不过当时并没有给出证明。在这篇文章中,我们将针对数论中的积性函数问题,讨论更多的模型。
首先我们先给出一些定义。
定义1:定义在所有正整数上的函数成为算数函数。
定义2:算术函数f如果满足对于任意两个互素的正整数m、n,均由f(mn) = f(m)f(n),就称其为积性函数。如果对于任意的m、n满足上述性质,则称其为完全积性函数。
下面我们基于此来讨论欧拉函数φ(n)。
首先,该函数的含义表示不超过n且与n互素的正整数的个数。基于对该函数的含义,我们会得出如下的定理。
定理1:如果p是素数,则φ(p) = p - 1。 定理2:如果p是素数,则φ(p^a) = p^a - p^(a-1)。
证明:不超过p^a的数有p^a 个,这其中我们找到与p^a是非互素关系的数——p、2p、3p、4p……p^(a-1)p,有p^(a-1)个,由此得证。
定理3:设n =∏p^ai是正整数n的素数幂分解,那么有φ(n) = n ∏(1 - pi)。 证明:首先基于算数基本定理,对于任意大于1的正整数我们都可以写成素数幂分解的形式,然后再基于定理2,通过化简整理即可得到欧拉函数的通式。
基于我们给出的这三条定理,我们通过一个题目来具体实现欧拉函数值的求解。(Problem source : pku 2407)
Description
Input
Output
题目大意:典型的计算欧拉函数值的问题。 编程实现:知晓了的计算通式,我们只需要通过简单的编程技巧来实现即可。 实现计算欧拉函数值的方法有很多,这里我们给出直接实现的方法。即遍历出n所有的素因子然后套用公式,优化技巧很类似与我们在《数论及其应用——素数问题》中探讨过的,找素因子只需穷举<=sqrt(n),即可。
参考代码如下。
#include<cstdlib> #include<iostream> using namespace std; int phi(int n) { int rea = n; for(int i = 2;i*i <=n;i++) if(n%i == 0) { rea = rea - rea/i; do n /= i; while(n%i == 0); } if(n > 1) rea = rea - rea/n; return rea; } int main() { int n; while(cin >> n && n) { cout << phi(n) << endl; } return 0; }
——未完
以上是关于数论及其应用——积性函数问题的主要内容,如果未能解决你的问题,请参考以下文章