首页 > 其他分享 >扩展欧几里得详解——同余方程

扩展欧几里得详解——同余方程

时间:2024-07-08 22:57:57浏览次数:16  
标签:gcd int 逆元 欧几里得 long 详解 同余 式子

对于同余方程ax\equiv 1(\mathbf{mod}b\displaystyle )的话就是一个经典扩展欧几里得求逆元的题目。

这个可以转换成a*x-b*y=1,我们需要求的只是x和k从而得到一组解。

通常我们会得到a和b两个元素,假设a是7,b为40,通过扩展欧几里得进行运算。

这时也就是7*x-40*y= 1,我们第一步先开始从a,b两个数字里找到最大的那个

在这里的话是40,然后利用大的去除以小的也就是\frac{40}{7}=5 \cdots 5,5乘7得35,40-35余5。

  •  5=40-7*5,这个为我们的式子号,我们先放一边。

然后这时,我们要用余数和7去进行比较谁大,这里是7大,所以用大的去除以小的也就是  \frac{7}{5}= 1\cdots 2


  • 2= 7-5*1,这个为我们的式子号,因为我们的余数还未得到1,则继续此操作。

此时2与5去相比则为\frac{5}{2}= 2\cdots 1,余数为1了,那么写完最后一个式子就可以开始代换了。


  • 1= 5-2*2这个为我们最后的式子,因为已经得到1了,现在开始合并同类项

我们通过上面式子②替换掉式子中的2代入式子3中


  • 1= 5-\left ( 7-5*1 \right )*2此时我们的新式子还一个5,那么代入式子①进入

这里的话我们用式子①将式子④中的5替换掉


  • 1= \left ( 40-7*5 \right )-\left ( 7-5*1 \right )*2这时候进行合并同类项

1=40-7*7+5*2此时式子中还含有5这个元素我们继续使用式子进行代换(将式子中所有元素代换为ax-by=1即可)


  • 1=40-7*7+\left ( 40-7*5 \right )*2然后进行合并同类项

⑥ 1=40*3-7*17那么此时带入原式7*x-40*y= 1中则:x=-17,y=-3


  • 由于是负数,我们要将其化为正数,直接利用x+b=-17+40=23则结果为23

以上为扩展欧几里得数学演示。

下面为题目以及代码实现扩展欧几里得。

洛谷题目:P1082同余方程

输入:

输出:

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

// 扩展欧几里得算法函数,计算 ax + by = gcd(a, b) 的解 (x, y) 和 gcd(a, b)
int exgcd(int a, int b, int &x, int &y) {
    if (!b) { // 如果 b 为 0,意味着 gcd(a, b) = a,此时 x = 1, y = 0
        x = 1;
        y = 0;
        return a;
    }
    // 递归调用,直到 b 为 0
    int d = exgcd(b, a % b, x, y);
    int t = x; // 保存当前 x 的值
    x = y; // 更新 x 的值为上一步 y 的值
    // 更新 y 的值为 t - (a / b) * y, 其中 t 是上一步的 x
    y = t - (a / b) * y;
    return d; // 返回 gcd(a, b)
}

// 用于求解模逆元,返回 a 在模 b 意义下的逆元,即 x 使得 ax ≡ 1 (mod b)
int Exgcd(int a, int b) {
    int x, y; // 用于存储扩展欧几里得算法的解
    int gcd = exgcd(a, b, x, y); // 计算 gcd(a, b) 及对应的 x, y
    // 返回 x 在模 b 意义下的正整数形式的逆元
    return (x % b + b) % b; 
}

int main()
{
    fast
    //simeple
    int a, b;
    cin >> a >> b;
    cout << Exgcd(a, b);
    return 0;
}

标签:gcd,int,逆元,欧几里得,long,详解,同余,式子
From: https://blog.csdn.net/m0_73147661/article/details/140275900

相关文章

  • 【Javascript】微信小程序项目结构目录详解
    我白天是个搞笑废物表演不在乎夜晚变成忧伤怪物撕扯着孤独我曾经是个感性动物小心地感触现在变成无关人物                     ......
  • 【C++深度探索】继承机制详解(二)
    hellohello~,这里是大耳朵土土垚~......
  • 关于Python中的series详解与应用
    引言近期在学习Python的过程中学到了Pandas库,它是数据处理操作中一款非常强大且流行的工具。而Pandas的两个核心数据结构是Series和DataFrame(下一篇文章便会进行有关学习)。本篇将详细介绍Series,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较,仅为......
  • Python数据结构详解:列表、字典、集合与元组的使用技巧
    前言哈喽,大家好!今天我要和大家分享的是关于Python中最常用的数据结构:列表、字典、集合和元组的使用技巧。你有没有遇到过在处理数据时,不知道该用哪种数据结构来存储和操作数据的情况呢?别担心,今天这篇文章就来帮你搞定这些问题,让你在数据处理上更加得心应手。最后,别忘了关......
  • 【认证授权】权限系统设计详解
    【认证授权】权限系统设计详解1.权限系统设计概述2.主流权限模型概述ACL模型:访问控制列表DAC模型:自主访问控制MAC模型:强制访问控制RBAC:基于角色的权限访问控制ABAC模型:基于属性的访问控制3.RBAC的深度拓展4.RBAC权限管理的在实际系统中的应用5.企业案例:转转新权限......
  • LDAP 用户帐户控制 UserAccountControl 详解
    属性标志十六进制值十进制值属性标志说明SCRIPT0x00011将运行登录脚本ACCOUNTDISABLE0x00022已禁用用户帐户HOMEDIR_REQUIRED0x00088需要主文件夹LOCKOUT0x001016 PASSWD_NOTREQD0x002032无需密码PASSWD_CANT_CHANGE0x004064用户无法更改......
  • 一道关联对称点新定义题的详解
    原题:注:该题为2024北京中考考前数学精编卷最后一题,拿到的文档中给出该题的答案如下:其中第(2)问的答案是错误的.而且第(2)问题面的语句表述不通顺,修改如下: ......
  • 详解Web应用安全系列(9)点击劫持
    点击劫持(Clickjacking)漏洞,也被称为界面伪装攻击(UIRedressAttack)或UI覆盖攻击,是一种利用视觉欺骗手段进行的网络攻击方式。这种攻击方式通过技术手段欺骗用户点击他们本没有打算点击的位置,从而达到攻击者的目的。一、点击劫持的原理点击劫持攻击主要利用了HTML中的<iframe>标......
  • Nuxt框架中内置组件详解及使用指南(三)
    title:Nuxt框架中内置组件详解及使用指南(三)date:2024/7/8updated:2024/7/8author:cmdragonexcerpt:摘要:“Nuxt3框架中与组件的深度使用教程,包括如何使用这两个组件进行页面导航和加载指示的自定义配置与实战示例。”categories:前端开发tags:Nuxt3组件NuxtL......
  • Markdown语法详解
    Markdown学习标题三级标题四级标题表示标题,#号+空格+标题名称,1级标题#、2级标题2个#、最多6级标题字体hello,Word!hello,Word!hello,Word!hello,Word!前后各加2个**,代表加粗;加1个*代表斜体;加3个*代表斜体加粗;加2个~~代表删除线引用自律且努力,别让生活太安逸!用1个>......