蓝桥杯之初等数论(二)

2024-04-11 01:36
文章标签 初等 蓝桥 数论

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

上一篇:蓝桥杯之初等数论(一)讲了两种知识点,即素数和合数的判断,最大公约数和最小公倍数的判断,接下来,我继续讲解有关初等数论的有关知识点。

什么是同余定理:

同余定理,也称为模运算定理或同余式定理,是数论中的一个重要概念。它主要涉及到整数之间的某种等价关系,即两个整数除以同一个正整数,如果所得的余数相同,则称这两个整数对于该正整数同余。同余关系是一种等价关系,满足反身性、对称性和传递性。

同余定理在数学、计算机科学和密码学等领域都有广泛的应用。例如,在密码学中,同余定理常被用于构建各种加密算法和协议,确保信息的安全传输。在计算机科学中,同余定理也用于优化算法和提高计算效率。

具体来说,如果整数a和b除以正整数m的余数相同,那么我们就说a和b对模m同余,记作a≡b(mod m)。这里的“mod”表示取模运算,即求一个数除以另一个数的余数。同余定理在实际应用中可以帮助我们简化复杂的计算问题,通过将问题转化为模运算的形式,从而更容易找到解决方案。

下面让我们以一个例子来熟悉这个定理:

假设我们要找出所有小于20的正整数,这些整数除以3的余数等于2。

根据同余定理,我们可以表示为:x ≡ 2 (mod 3),其中x是我们要找的数。

现在,我们开始尝试小于20的每个正整数x,并检查它是否满足上述同余关系:

  1. 当x=1时,1除以3的余数是1,不等于2,所以不满足。
  2. 当x=2时,2除以3的余数是2,满足条件。
  3. 当x=3时,3除以3的余数是0,不等于2,所以不满足。
  4. 当x=4时,4除以3的余数是1,不等于2,所以不满足。
  5. 当x=5时,5除以3的余数是2,满足条件。

以此类推,我们继续检查直到x=20。通过这个过程,我们可以找出所有满足条件的x值,即那些除以3余数为2的数。在这个例子中,这些数是2, 5, 8, 11, 14, 17。

在Java中,实现同余定理的验证和求解相对简单。以下是一个简单的Java程序,用于查找小于给定值(例如20)的所有整数,这些整数满足除以3余数为2的条件。

public class CongruenceExample {  public static void main(String[] args) {  int modulus = 3; // 模数  int remainder = 2; // 余数  int limit = 20; // 限制查找的整数小于这个值  // 查找并打印所有小于limit且满足x mod modulus = remainder的整数x  for (int x = 1; x < limit; x++) {  if (x % modulus == remainder) {  System.out.println(x + " ≡ " + remainder + " (mod " + modulus + ")");  }  }  }  
}

当你运行这个程序时,它会输出所有小于20且满足x ≡ 2 (mod 3)的整数。

如果你想要解一个同余方程,比如ax ≡ b (mod m),并且你知道am是互质的(即它们的最大公约数为1),你可以使用扩展欧几里得算法来找到x的一个解。下面是一个使用扩展欧几里得算法来解同余方程的Java实现示例

public class CongruenceSolver {  public static void main(String[] args) {  int a = 2; // 方程的系数a  int b = 5; // 方程的余数b  int m = 3; // 模数m  // 求解同余方程 ax ≡ b (mod m)  int solution = solveCongruence(a, b, m);  if (solution != -1) {  System.out.println("同余方程的一个解是:x = " + solution);  } else {  System.out.println("同余方程无解");  }  }  // 使用扩展欧几里得算法求解同余方程 ax ≡ b (mod m)  public static int solveCongruence(int a, int b, int m) {  // 扩展欧几里得算法求解 ax + my = gcd(a, m)  int[] result = extendedGcd(a, m);  int gcd = result[0];  // 检查是否有解  if (b % gcd != 0) {  return -1; // 无解,因为b不是gcd的倍数  }  // 计算x的值  int x = (b / gcd * result[1]) % m;  if (x < 0) {  x += m; // 保证解是非负的  }  return x;  }  // 扩展欧几里得算法求解 ax + by = gcd(a, b)  public static int[] extendedGcd(int a, int b) {  if (b == 0) {  return new int[]{a, 1, 0}; // gcd, x, y  }  int[] vals = extendedGcd(b, a % b);  int gcd = vals[0];  int x = vals[2];  int y = vals[1] - (a / b) * vals[2];  return new int[]{gcd, x, y};  }  
}

首先,让我们回顾一下同余方程ax ≡ b (mod m)。这个方程意味着存在一个整数x,使得ax除以m的余数是b。这样的x可能有多个解,或者可能无解,这取决于abm的具体值。

现在,让我们逐步分析CongruenceSolver类中的代码:

  1. 主方法 (main):
    • 初始化变量abm
    • 调用solveCongruence方法求解同余方程,并打印结果。
  2. 求解同余方程的方法 (solveCongruence):
    • 使用extendedGcd方法求解ax + my = gcd(a, m)。这里的gcd(a, m)表示am的最大公约数。
    • 检查b是否是gcd(a, m)的倍数。如果不是,则方程无解,返回-1。
    • 如果有解,则根据扩展欧几里得算法的结果计算x的值,并返回它。
  3. 扩展欧几里得算法 (extendedGcd):
    • 这是一个递归方法,用于求解ax + by = gcd(a, b)的整数解xy
    • b为0时,gcd(a, b)就是a,此时x为1,y为0。
    • 否则,递归调用extendedGcd(b, a % b),并根据递归结果计算xy的值。

现在,让我们逐步解释扩展欧几里得算法如何工作:

扩展欧几里得算法是基于欧几里得算法(用于计算最大公约数)的扩展。它不仅能找到两个数的最大公约数,还能找到使得ax + by = gcd(a, b)成立的整数xy

递归的基础情况是当b为0时,此时gcd(a, 0)就是a,且x为1,y为0满足方程。

对于递归的其他情况,我们利用欧几里得算法的一个性质:gcd(a, b) = gcd(b, a % b)。因此,我们可以递归地求解bx' + (a % b)y' = gcd(b, a % b),其中x'y'是新的未知数。一旦我们得到了x'y'的值,我们就可以利用它们来计算xy的值。

具体来说,我们有:

 

复制代码

bx' + (a % b)y' = gcd(b, a % b)
bx' + (a - (a / b) * b)y' = gcd(a, b) // 因为 a % b = a - (a / b) * b
ax - by = gcd(a, b) // 这是我们要找的方程

通过比较上述两个方程,我们可以解出xy

 

复制代码

x = y'
y = x' - (a / b) * y'

这样,我们就可以使用递归的结果来计算xy的值。

solveCongruence方法中,我们利用扩展欧几里得算法找到x的一个值,该值满足ax + my = gcd(a, m)。然后,我们通过乘以b / gcd(a, m)并取模m来找到满足ax ≡ b (mod m)x的值。

这篇关于蓝桥杯之初等数论(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

数论入门整理(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

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

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

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

每日一题~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来补齐,剩下