首页 > 其他分享 >初级数学 学习笔记

初级数学 学习笔记

时间:2025-01-13 12:28:12浏览次数:3  
标签:gcd int k1 笔记 times k2 初级 数学 y1

数论基本概念

1. 整除法

n = a k + r ( 0 ≤ r < a ) → k = ⌊ n a ⌋ n = ak + r(0 \le r < a) \to k = \lfloor \frac{n}{a} \rfloor n=ak+r(0≤r<a)→k=⌊an​⌋

2. 算数基本定理

p i p_i pi​ 为素数,且 p i < p i + 1 p_i < p_{i + 1} pi​<pi+1​,则有:
n = p 1 a 1 p 2 a 2 ⋯ p m a m n = p_1^{a_1} p_2^{a_2} \cdots p_m ^ {a_m} n=p1a1​​p2a2​​⋯pmam​​

3. 最大公约数与最小公倍数

gcd ⁡ ( a , b ) × l c m ( a , b ) = gcd ⁡ ( a , b ) × a × b gcd ⁡ ( a , b ) = a × b \gcd (a,b) \times lcm (a,b) = \gcd (a,b) \times \frac{a \times b}{\gcd(a,b)} = a \times b gcd(a,b)×lcm(a,b)=gcd(a,b)×gcd(a,b)a×b​=a×b

4. 求一个数的约数个数

一个数的每个因子均由若干个素因子构成,第 i i i 个素因子共有 i + 1 i + 1 i+1 种取法,所以总个数为( k k k 为素因子的总个数):
∏ i = 1 k ( a i + 1 ) \prod_{i = 1}^{k} (a_i + 1) i=1∏k​(ai​+1)
代码如下:

int divisor (int n)//算数基本定理
{
   
    int tot = 1;
    for (int i = 2;i * i <= n;++i)
    {
   
        if (n % i == 0)
        {
   
            int cnt = 0;
            while (n % i == 0) n /= i,++cnt;//素因子i 在 num 中的个数
        	tot *= (cnt + 1);
        }
    }
    if (n > 1) tot *= 2;//剩下的 n 也为素数的情况
    return tot;
}

int divisor_direct (int n)//直接暴力枚举
{
   
    int cnt = 0;
    for (int i = 1;i * i <= n;++i)
    {
   
        if (n % i == 0)
        {
   
            ++cnt;
            if (n / i != i) ++cnt;//完全平方数时会重复计算
        }
    }
    return cnt;
}

素数筛法

1. 朴素筛法

将每一个数的所有倍数都筛去,时间复杂度为: O ( n 2 + n 3 + ⋯ + 1 ) O(\frac{n}{2} + \frac{n}{3} + \cdots + 1) O(2n​+3n​+⋯+1)。所以当 lim ⁡ ( n → ∞ ) \lim(n \to \infty) lim(n→∞) 时,近似为 O ( n log ⁡ n ) O(n\log n) O(nlogn)。

2. 常数优化

枚举小的那个因子。

for (int i = 2;i * i <= n;++i)
    if (!flag[i])
        for (int j = i * i;j <= n;j += i) flag[j] = 1;

3. 线性筛

时间复杂度为 O ( n ) O(n) O(n)。

void work (int n)//保证每个数最多被筛一次
{
   
    for (int i = 2;i <= n;++i)
    {
   
        if (!flag[i]) p[++cnt] = i;//素数
        for (int j = 1;j <= cnt;++j)
        {
   
            if (i * p[j] > n) break;//边界
            flag[i * p[j]] = 1;//p[j] 是 i * p[j] 的最小素因子
            if (i % p[j] == 0) break;//之后 p[j] 不为 i * p[j] 的最小素因子
            //若 p[j] = 2,i = 4,则之后 p[j] = 3,i = 4 不符合条件。否则 12 = 2*6 = 3 * 4 被筛的次数 > 1
        }
    }
}
欧几里得算法

1. 辗转相减

若 a > b a > b a>b,则 gcd ⁡ ( a , b ) = gcd ⁡ ( a − b , b ) \gcd (a,b) = \gcd (a - b,b) gcd(a,b)=gcd(a−b,b)。

2. 辗转相除

若 a > b a > b a>b,则 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a % b ) \gcd (a,b) = \gcd (b,a \% b) gcd(a,b)=gcd(b,a%b)。

int gcd (int a,int b)
{
   
    if (a < b) swap (a,b);
    return (!b) ? a : gcd (b,a % b);
}

扩展欧几里得算法

由欧几里得算法可知 a x + b y = gcd ⁡ ( a , b ) ax + by = \gcd (a,b) ax+by=gcd(a,b) 一定存在一组解。那么求解 a x + b y = c ax + by = c ax+by=c 时,过程如下:
a x + b y = c ( a > b ) 设   a x ′ + b y ′ = gcd ⁡ ( a , b ) 则辗转相减知   ( a − b ) × x 1 + b × y 1 = gcd ⁡ ( a , b ) ∴ a × x 1 + b × ( y 1 − x 1 ) = gcd ⁡ ( a , b ) ∴ x = x 1 , y = y 1 − x 1 由辗转相除代替辗转相减,则有   b × x 1 + a % b × y 1 = gcd ⁡ ( a , b ) ∵ a % b = a − ⌊ a b ⌋ × b ∴ b × x 1 + ( a − ⌊ a b ⌋ × b ) × y 1 = gcd ⁡ ( a , b ) ∴ a × y 1 + b × ( x 1 − ⌊ a b ⌋ × y 1 ) = gcd ⁡ ( a , b ) ∴ x = y 1 , y = x 1 − ⌊ a b ⌋ × y 1 ax + by = c(a > b)\\ \texttt{设 } ax' + by' = \gcd (a,b)\\ \texttt{则辗转相减知 } (a - b) \times x_1 + b \times y_1 = \gcd (a,b)\\ \therefore a \times x_1 + b \times (y_1 - x_1) = \gcd (a,b)\\ \therefore x = x_1,y = y_1 - x_1\\ \\ \texttt{由辗转相除代替辗转相减,则有 } b \times x_1 + a \% b \times y_1 = \gcd (a,b)\\ \because a \% b = a - \lfloor \frac{a}{b} \rfloor \times b\\ \therefore b \times x_1 + (a - \lfloor \frac{a}{b} \rfloor \times b) \times y_1 = \gcd (a,b)\\ \therefore a \times y_1 + b \times (x_1 - \lfloor \frac{a}{b} \rfloor \times y_1) = \gcd (a,b)\\ \therefore x = y_1,y = x_1 - \lfloor \frac{a}{b} \rfloor \times y_1 ax+by=c(a>b)设 ax′+by′=gcd(a,b)则辗转相减知 (a−b)×x1​+b×y1​=gcd(a,b)∴a×x1​+b×(y1​−x1​)=gcd(a,b)∴x=x1​,y=y1​−x1​由辗转相除代替辗转相减,则有 b×x1​+a%b×y1​=gcd(a,b)∵a%b=a−⌊ba​⌋×b∴b×x1​+(a−⌊ba​⌋×b)×y1​=gcd(a,b)∴a×y1​+b×(x1​−⌊ba​⌋×y1​)=gcd(a,b)∴x=y1​,y=x1​−⌊ba​⌋×y1​
不断递归得到 gcd ⁡ ( a , b ) × x + 0 × y = gcd ⁡ ( a , b ) \gcd (a,b) \times x + 0 \times y = \gcd (a,b) gcd(a,b)×x+0×y=gcd(a,b),得到特解 x = 1 , y = 0 x = 1,y = 0 x=1,y=0。

int exgcd (int a,int b,int &x,int &y)
{
   
    int g = a;
    if (b)
    {
   
        g = exgcd (b,a % b,x,y);
        x -= (a / b) * y;
        swap (x,y);
    }
    else x = 1,y = 0;//一组特解
    return g;
}

设 k 1 = a ÷ gcd ⁡ ( a , b ) , k 2 = b ÷ gcd ⁡ ( a , b ) k_1 = a \div \gcd (a,b),k_2 = b \div \gcd (a,b) k1​=a÷gcd(a,b),k2​=b÷gcd(a,b),显然 gcd ⁡ ( k 1 , k 2 ) = 1 \gcd (k_1,k_2) = 1 gcd(k1​,k2​)=1。设 x , y x,y x,y 的最小变化单位是 d 1 , d 2 d_1,d_2 d1​,d2​,则此时 k 1 = d 2 , k 2 = d 1 k_1 = d_2,k_2 = d_1 k1​=d2​,k2​=d1​,所以通解是:

{ x = x + k × b gcd ⁡ ( a , b ) y = y − k × a gcd ⁡ ( a , b ) k ∈ Z \begin{cases} x = x + k \times \dfrac{b}{\gcd(a,b)}\\ y = y - k \times \dfrac{a}{\gcd(a,b)}\\ k \in \Z \\ \end{cases} ⎩ ⎧​x=x+k×gcd(a,b)b​y=y−k×gcd(a,b)a​k∈Z​

欧拉函数

1. 定义

ϕ ( n ) \phi(n) ϕ(n) 表示小于等于 n n n 的正整数与 n n n 互质的个数。 并且规定 ϕ ( 1 ) = 1 \phi(1) = 1 ϕ(1)=1。

2. 积性函数

设 p p p 为质数,求 ϕ ( p k ) \phi(p^k) ϕ(pk),也就是总数减去所有 p p p 的倍数。
ϕ ( p k ) = p k − ( p k ÷ p ) = p k − p k − 1 = ( p − 1 ) × p k − 1 \phi(p^k) = p^k - (p^k \div p) = p^k - p^{k - 1} = (p - 1) \times p^{k - 1} ϕ(pk)=pk−(pk÷p)=pk−pk−1=(p−1)×pk−1
同理,求 ϕ ( p 1 k 1 × p 2 k 2 ) \phi(p_1 ^ {k_1} \times p_2 ^ {k_2}) ϕ(p1k1​​×p2k2​​),也就是总数减去 p 1 , p 2 p_1,p_2 p1​,p2​ 的倍数,然后再加上 p 1 × p 2 p_1 \times p_2 p1​×p2​ 的倍数。
∴ ϕ ( p 1 k 1 p 2 k 2 ) = p 1 k 1 p 2 k 2 − p 1 k 1 − 1 p 2 k 2 × p 1 k 1 p 2 k 2 − 1 + p 1 k 1 − 1 p 2 k 2 − 1 ∴ ϕ ( p 1 k 1 p 2 k 2 ) = ϕ ( p 1 k 1 ) × ϕ ( p 2 k 2 ) \therefore \phi ({p_1} ^ {k_1} {p_2} ^ {k_2}) = {p_1} ^ {k_1} {p_2} ^ {k_2} - {p_1} ^ { {k_1} - 1} {p_2} ^ {k_2} \times {p_1} ^ {k_1} {p_2} ^ { {k_2} - 1} + {p_1} ^ { {k_1} - 1}{p_2} ^ { {k_2} - 1}\\ \therefore \phi ({p_1} ^ {k_1} {p_2} ^ {k_2}) = \phi({p_1} ^ {k_1}) \times \phi({p_2} ^ {k_2}) ∴ϕ(p1​k1​p2​k2​)=p1​k1​p2​k2​−p1​k1​−1p2​k2​×p1​k1​p2​k2​−1+p1​k1​−1p2​k2​−1∴ϕ(p1​k1​p2​k2​)=ϕ(p1​k1​)×ϕ(p2​k2​)

3. 计算通式

将 n n n 进行质因数分解,则有:
n = p 1 a 1 p 2 a 2 ⋯ p m a m ∴ ϕ ( n ) = ∏ i = 1 m p i k i − 1

标签:gcd,int,k1,笔记,times,k2,初级,数学,y1
From: https://blog.csdn.net/scy923/article/details/144992185

相关文章

  • 机器学习笔记合集
    ......
  • 深度学习笔记合集
    ......
  • Powershell-2学习笔记
    声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站......
  • THREE.js学习笔记3——Animations
    这一小节主要学习动画。在JavaScript中的动画,其实就是渲染一帧,停顿一会儿,再渲染一帧。所以我们需要在每一帧都更新物体和重新渲染。调用window.requestAnimationFrame();函数来实现。ThepurposeofrequestAnimationFrameistocallthefunctionprovidedonthenextframe......
  • Win32汇编学习笔记10.OD插件
    筛选器异常插件Win32汇编学习笔记10.OD插件-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区-BpSend.net被调试程序: ......
  • 【AI中数学-线代-综合实例-包括python实现】 聚焦注意力:解析GPT等大模型中的注意力机
    第三章线性代数--综合实例第11节聚焦注意力:解析GPT等大模型中的注意力机制在人工智能的众多技术中,注意力机制(AttentionMechanism)无疑是推动大规模模型如GPT(GenerativePre-trainedTransformer)取得突破性进展的关键因素之一。本节将通过五个实际应用案例,深入解析注意力机......
  • 2024年秋学期 分析力学(理论物理基础Ⅰ)笔记
    内容说明舍去了哈密顿雅可比方程等内容删去了振动相关的一些模型,如参数共振等授课难度疑似过大了一点(毕竟才半个学期),协变相关内容疑似太tm多了有心力场模块笔记有所省略,部分笔记不排除记录有误的可能性部分章节间未换页笔记正文拉格朗日力学及其协变形式......
  • Super Fenwick 学习笔记
    她是谁(What)?超级树状数组(SuperFenwick或SuperBIT)是一种维护线性数据,支持区间修改,区间查询的数据结构,其中要求运算符满足结合律,可逆性。(例如异或,加法,乘法或非奇异的矩阵乘法)正如其名字,超级树状数组的本质是树状数组,因此,她也继承了树状数组的所有优点:码量小常数小空间小......
  • 【数学】概率论与数理统计(五)
    文章目录@[toc]二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答边缘分布函数二维随机......
  • C语言学习笔记:运算
    运算在C语言中的运算共有以下几种:-算术运算:+ - * / %(模运算)-赋值运算:将等号的右值赋给左值-关系(比较)运算:其结果为真(非0)、假(0)== != > >= < <= -逻辑运算:&& 并且,||  或者,!  非。-位运算-三元运算对于算数运算进行介绍,算数运算和我们平......