浅谈数论

浅谈数论

待更

欧几里得算法

gcd(a,b)=gcd(b,a%b)

说人话就是辗转相除法

证明:

\[令a=bk+c \\ \therefore c=a-b*k \\ 设有公约数d|a,d|b \\ \therefore \frac{a}{d}-\frac{b}{d}*k=\frac{c}{d} \\ \therefore d|c \]

此处使用递归实现

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

扩展欧几里得算法

使用欧几里得算法处理不定方程\(ax+by=gcd(a,b)\)

\[ax+by=gcd(a,b) =gcd(b,a\;mod\;b) =b*x'+(a\;mod\;b)*y' \\ =b*x'+(a-\lfloor\frac{a}{b}\rfloor*b)*y' =ay'+b(x'-\frac{a}{b}y') \\ \because ax+by=ay'+b(x'-\frac{a}{b}y') \\ \therefore \begin{cases} x=y' \\ y=x'-\frac{a}{b}y' \end{cases} \]

由此不断递归,当\(gcd=0\)时得

\[\begin{cases} x=1 \\ y=0 \end{cases} \]

其实现如下

int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1, y = 0;
        return a;
    }
    int gg = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return gg;
}
posted @ 2023-02-14 20:29  ssj_233  阅读(10)  评论(0编辑  收藏  举报