俯视膜拜初等数论

2024-02-16 03:18
文章标签 初等 数论 膜拜 俯视

本文主要是介绍俯视膜拜初等数论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一部分:质数

质数


又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
质数是一个孤独的数字呀!

质因数分解


什么是质因数分解?

就是将一个数字分解成几个质数相乘。小学时候我们就学过的,很简单。比如 9=33 9 = 3 ∗ 3 ;但是 64=88 64 = 8 ∗ 8 就不对了,因为8不是质数啊!

有什么用?

用处很大很大的!后面的求欧拉函数就是在这个的基础之上建立的。

思路是什么?

我暂时也不能理解为什么这么干。

代码

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;vector<int> factor(int n)
{vector<int> ans;for (int i = 2; i <= sqrt(n); i++){while (n%i == 0){ans.push_back(i);n /= i;}}if (n > 1){ans.push_back(n);}return ans;
}int main()
{int n;cin >> n;vector<int>ans=factor(n);for (int i = 0; i < ans.size(); i++){cout << ans[i] << " ";}
}

欧拉函数

欧拉函数是什么?

在数论,对正整数 n n ,欧拉函数是小于n的正整数中与 n n 互质的数的数目φ(1)=1。此函数以其首名研究者欧拉命名(Euler’so totient function)。 例如 φ(8)=4 φ ( 8 ) = 4 ,因为 1,3,5,78 1 , 3 , 5 , 7 均 和 8 互质。
这里有一个求欧拉函数的简便方法

思路

基于上面的分解质因数的算法

代码

XX

第二部分:求解不定方程

欧几里得算法


扩展欧几里得算法


怎么证明是对的?

忘了

有什么用?

可以用来求 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) 中的 xy x 和 y 的值。

那么问题来了如何求 ax+by=z a x + b y = z 的值呢?只需要将 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) 的解 x1y1 x 1 和 y 1 扩大 z/gcd(a,b) z / g c d ( a , b ) 倍就可以了。

举个例子:
我可以直接先求 3x+7y=(3,7) 3 x + 7 y = ( 3 , 7 ) 的解,也就是 3x+7y=1 3 x + 7 y = 1 的解。我们得到 x=2y=1 x = − 2 , y = 1 。然后我们将 xy x 和 y 扩大 50/(3,7) 50 / ( 3 , 7 ) 倍,也就是 50/1 50 / 1 倍,得到 x=250,y=150 x = − 2 ∗ 50 , y = 1 ∗ 50 。于是我们得到了 3x+7y=50 3 x + 7 y = 50 的解是 10050 − 100 和 50

代码

#include <iostream>
using namespace std;
int gcdEx(int a, int b, int &x, int &y) 
{if(b==0){x=1;y=0;return a;}int r = gcdEx(b, a%b, x, y);int x1 = x, y1 = y;x = y1;y = x1 - (a / b) * y1;return r;
}
int main()
{int x, y;cout<<gcdEx(47, 30, x, y)<<"\n";cout<<x<<" "<<y;return 0;
}

解二元一次不定方程


有什么卵用?

可以求逆元啊!!
同余方程可以转为不定方程,所以解同余方程可以看成解不定方程。

代码

#include <iostream>
using namespace std;
int gcdEx(int a, int b, int &x, int &y)
{if (b == 0){x = 1;y = 0;return a;}int r = gcdEx(b, a%b, x, y);int x1 = x, y1 = y;x = y1;y = x1 - (a / b) * y1;return r;
}
int main()
{int x, y;int a, b, c; //ax+by=ccin >> a >> b>> c;int numGcd = gcdEx(a, b, x, y);cout << c / numGcd * x << " " << c / numGcd * y;return 0;
}

逆元


逆元是什么?逆天啊!

当a,m互质,若 ax1(modm) a x ≡ 1 ( m o d m ) ,则x是a关于模m的逆元。

逆元有什么用?

我也不知道

怎么求逆元

当a,m互质, ax1(modm) a x ≡ 1 ( m o d m ) 。我们知道 ax1(modm) a x ≡ 1 ( m o d m ) 等价于 ax+my=1 a x + m y = 1 。那么 ax+my=1 a x + m y = 1 不就是个不定方程吗?直接用exgcd解不就行了吗?
注意解出的x可能是负数,如果是负数我们就直接加上m就行了。依据是不定方程通解公式,如下。
不定方程通解公式

思路

就把它当做一个不定方程的问题来处理就行了。

代码

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;int exgcd(int a, int b, int &x, int &y)
{if (b == 0){x = 1;y = 0;return a;}int r = exgcd(b, a%b, x, y);int x1 = x;int y1 = y;x = y1;y = x1 - (a / b) * y1;return r;
}// 求逆元
int inverse(int a, int m)
{int x, y;exgcd(a, m, x, y);return x;
}int main()
{int a, m;cin >> a >> m;int ans = inverse(a, m);if (ans < 0){cout << ans + m;}else{cout << ans;}
}

这篇关于俯视膜拜初等数论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713332

相关文章

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

POJ2247数论

p = 2^a*3^b*5^c*7^d 求形如上式的第n小的数。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.u

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor

ZOJ1007(数论)

题目链接:点击打开链接 解题思路:   纯粹的数学题,没有输入,直接要求输出.直接给出的求和式子极限到无穷,无法直接计算.Hint里给出了提示,大意就是说求g(x) - g(1)的求和极限,最后再加上g(1)就能求出g(x).   由g(x)  - g(1) 能够得出 1 / k*(k+x) - 1 / k * (k + 1) = (1 - x) / k * ( k + 1) * (k

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

等式(数论/唯一分解定理)

链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。(1<=n<=1e9) 输出描述: 输出符合该方程要求的解数。

数论 - 整除问题 --- 整数集合中找出3的最大倍数

Mean:   题目描述:给一个包含非负整数的数组(长度为n),找出由这些数字组成的最大的3的倍数,没有的话则输出impossible。 analyse: 首先想到的就是直接暴力,这是最蠢的方法,数据一大的话,必会TLE。 直接用蛮力的话,生成所有的组合,为 2^n个,对每个数字再进行比较判断,需要 O(n)的时间,因为n可能会比较大,需要每个位的比较。总的时间复杂度为O(n * 2