math数学部分

gcd最大公约数(欧几里德算法,迭代形式)

int gcd(int a,int b)//普通方法
{
	int m,n,r;
	m=a>=b?a:b;//m>=n
	n=a<b?a:b;
	r=m%n;
	while(r!=0)
	{
		m=n;
		n=r;
		r=m%n;
	}
	return n;
}

lcm最小公倍数
int lcm(int a,int b)
{
  return a/gcd(a,b)*b;
}

gcd的优化,Stein算法+位运算,可以算较大的整数
int gcdcore(int a,int b)
{
  if (a==0) return b;
  if (b==0) return a;
  while ((a & 0x1)==0)
  {
    a=a>>1;
  }
  if (a<b)
  {
    b=(b-a)>>1;
    return gcdcore(b,a);
  }
  else
  {
    a=(a-b)>>1;
    return gcdcore(a,b);
  }
}
int gcd_fast(int a,int b)//stein算法+位运算优化
{
  int c=0;
  while (((a & 0x1)==0)&&(( b & 0x1 )==0))
  {
    a=a>>1;
    b=b>>1;
    c++;
  }
  if ((a & 0x1) == 0)
  {
    a=a>>1;
    return gcdcore(a,b)<<c;
  }
  else
    return gcdcore(b,a)<<c;

}

扩展欧几里德算法(递归形式)
int ex_gcd(int a,int b,int &x,int &y)
{
  int tmp,ans;
  if(b==0)
  {
    x=1;
    y=0;
    return a;
  }
  ans=ex_gcd(b,a%b,x,y);
  tmp=x;
  x=y;
  y=tmp-(a/b)*y;
  return ans;
}

扩展欧几里德算法(迭代形式)
int exgcd(int m,int n,int &x,int &y)//迭代形式
{
  int x1,y1,x0,y0;
  x0=1; y0=0;
  x1=0; y1=1;
  x=0; y=1;
  int r=m%n;
  int q=(m-r)/n;
  while(r)
  {
    x=x0-q*x1; y=y0-q*y1;
    x0=x1; y0=y1;
    x1=x; y1=y;
    m=n; n=r; r=m%n;
    q=(m-r)/n;
  }
  return n;
}

扩展欧几里德求乘法逆元
int cal(int a,int m)//乘法逆元
{
  int x,y;
  int gcd=ex_gcd(a,m,x,y);
  if(1%gcd!=0)
    return -1;
  x*=1/gcd;
  m=abs(m);
  int ans=x%m;
  if(ans<=0)
    ans+=m;
  return ans;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值