前言
在密码学、RSA 加密、数论类 CTF 题目里,最大公约数 GCD是最基础、最高频的前置知识点,几乎所有公钥密码题型都会依赖 GCD 与互质的概念。 这道入门题完整讲解了 GCD 定义、互质概念、欧几里得辗转相除法,同时提供可直接运行的 Python 代码,非常适合新手入门数论类密码题。本文整理成完整可发布的技术博客,包含原理、代码、拓展知识点。
一、题目完整信息
基础信息
- 题目名称:Greatest Common Divisor(最大公约数)
- 题型:密码学 - 基础数论
- 分值:15 分
- 难度:入门级
题目原文描述
最大公约数(GCD,也叫最高公因数),指能够同时整除两个正整数(a,b)的最大正整数。
- 示例 1:
a=12,b=812 的因数:{1,2,3,4,6,12}8 的因数:{1,2,4,8}公共因数最大值为 4,即gcd(12,8)=4 - 示例 2:
a=11,b=17,二者均为质数 质数的因数只有 1 和自身,因此公共因数只有 1,gcd(11,17)=1
核心概念:互质(Coprime)
若两个整数a,b的最大公约数gcd(a,b)=1,则称a和b互质。 推论:
- 两个不同质数一定互质;
- 若
a是质数,且b < a,则a、b一定互质; - 思考题:如果质数
a,b > a,二者不一定互质(例:a=3,b=6,gcd=3,不互质)。
解题要求
推荐使用欧几里得算法(辗转相除法)编写代码,先用a=12,b=8测试代码正确性,最后计算:
gcd(a=66528, b=52920) 计算结果即为 flag。
二、前置核心知识点
1. GCD 基础定义
给定两个正整数,能同时整除两者的最大自然数,记作 gcd(a,b)。
- 若 gcd(a,b)=1:两数互质;
- 质数
p与小于它的所有自然数互质; - 若另一个数包含该质数作为因子,则不互质。
2. 欧几里得辗转相除法核心原理
核心公式:
gcd(a,b)=gcd(b, amodb) 循环取模,直到余数为 0,此时的b就是最大公约数。 逻辑演示(测试样例 a=12,b=8):
- gcd(12,8)=gcd(8, 12mod8=4)
- gcd(8,4)=gcd(4, 8mod4=0)
- 余数为 0,终止,结果 = 4,和题目示例一致。
3. Python 两种实现方式
- 手动实现欧几里得算法(理解底层原理,CTF 数论题必考手写);
- 标准库
math.gcd快速调用(适合快速出结果,注意库函数限制)。
三、完整解题代码 & 分步讲解
方案 1:手动实现欧几里得辗转相除法(推荐学习)
python
运行
# 自定义欧几里得算法求GCD def gcd(a, b): while b != 0: # 取模,更新a、b a, b = b, a % b return a # 题目测试用例 test_a = 12 test_b = 8 print(f"测试用例 gcd({test_a},{test_b}) = {gcd(test_a, test_b)}") # 题目要求计算的数值 num_a = 66528 num_b = 52920 result = gcd(num_a, num_b) print(f"目标 gcd({num_a},{num_b}) = {result}")代码拆解
- 循环条件
while b != 0:只要余数不为 0,持续迭代; a, b = b, a % b:同步更新变量,把除数变成新被除数,余数变成新除数;- 当
b=0时循环结束,此时a就是最大公约数; - 先用题目给的
12,8测试,验证代码逻辑无错误,再代入题目大数计算。
方案 2:Python 标准库快速求解
python
运行
import math # math.gcd仅接收非负数,且返回绝对值GCD a = 66528 b = 52920 res = math.gcd(a, b) print(res)注意:
math.gcd存在限制,只能处理正数、大数模运算手写算法兼容性更强,CTF 复杂数论场景推荐手写。
四、运行结果与验证
控制台输出
plaintext
测试用例 gcd(12,8) = 4 目标 gcd(66528,52920) = 1512最终计算结果:1512,与题目给出的 flag 完全匹配。
手动推演简略过程(辅助理解)
- gcd(66528, 52920) = gcd(52920, 13608)
- gcd(52920, 13608) = gcd(13608, 12096)
- gcd(13608, 12096) = gcd(12096, 1512)
- gcd (12096, 1512) = gcd (1512, 0) 余数为 0,终止,GCD=1512。
五、核心概念拓展(密码学高频考点)
1. 互质在密码学中的作用
RSA 加密算法的核心前提:选取两个大质数p,q,计算 φ(n)=(p−1)(q−1),加密公钥e必须满足 gcd(e,φ(n))=1(互质),否则无法求出解密私钥d。
2. 欧几里得算法拓展:扩展欧几里得
普通 GCD 只能求最大公约数,扩展欧几里得算法可以同时求出满足 ax+by=gcd(a,b) 的整数解x,y,是求解模逆元的核心工具,几乎所有 RSA 解密题都会用到。
3. 常见题型变形
- 给出两个大数求 GCD(本题原型);
- 多数字 GCD:
gcd(a,b,c) = gcd(gcd(a,b),c); - 结合模逆元、RSA 分解模数、同余方程。
六、新手学习避坑总结
- 不要暴力枚举因数:大数分解因数效率极低,欧几里得算法迭代次数极少,百万级数字也能瞬间算出;
- 区分「质数」和「互质」:两个数互质不代表都是质数(例:gcd (8,9)=1,二者都不是质数);
- 库函数
math.gcd坑点:只返回正数、无法处理 0、负数会自动取绝对值,复杂数论场景建议手写辗转相除; - 思考题答案:质数a=3,b=6,b>a,b是a的倍数,此时 gcd=3≠1,不互质。