关于逆元的学习笔记(尚未完成)

QwQ嘤嘤嘤 只是为了整理一下自己的求逆元的方法

假设我们要求a在模p意义下的逆元,我们会有以下几种做法:

1>如果p是质数的话

a p 1 1 ( mod p )

那么我们稍加变形,就能得出

a p 2 1 a ( mod p )

那么 a p 2 就是逆元了
可以直接用快速幂求解

ll qsm(ll ii,ll j)
{
  ll ans=1;
  while (j)
  {
     if (j&1) ans=ans*i%mod;
     i=i*i%mod;
     j>>=1;
  }
  return ans;
}

int main()
{
    inv = qsm(a,p-2)
}

2.扩展欧几里得
求逆元,实际上就是求这个式子的x

a x 1 ( mod p )

然后解一下就好

void exgcd(ll &x,ll &y,ll a,ll b)
{
  if (b==0)
  {
    x=1;
    y=0;
    return;
  }
  exgcd(x,y,b,a%b);
  ll tmp =x;
  x=y;
  y=tmp-a/b*y;
}

3.线性求逆元

能够求出 1 n 所有数在 m o d p意义下的逆元

首先我们对于一个要求的数 i 来说

p = k i + r
那么

k i + r 0 ( mod p )

等式两边同时乘 i 1 r 1

k r 1 + i 1 0 ( mod p )

i 1 k r 1 ( mod p )

又因为 k = p i r = p   %   i

所以

i 1 p i ( p mod   i ) 1 ( mod p )

inv[1]=1;
  for (int i=2;i<=n;i++)
  {
     inv[i]=-(p/i)*inv[p%i];
     inv[i]=(inv[i]%p+p)%p;
  }

猜你喜欢

转载自blog.csdn.net/y752742355/article/details/80634931