C++ N模算法
所以,从我在互联网上读到的,模可以做到:C++ N模算法,c++,math,modulo,C++,Math,Modulo,所以,从我在互联网上读到的,模可以做到: (a*b) % n = (a % n * b % n)%n; 我能理解,因为a%n*b%n可能比n大,所以我们必须再次取模n,但我不明白!来自internet的mod p.算法: int result = 1; for (int i = 1 ; i <= n ; i++) { result = (result * i ) % p; } cout<<result; Let's say n = 3 , and p is 7. W
(a*b) % n = (a % n * b % n)%n;
我能理解,因为a%n*b%n可能比n大,所以我们必须再次取模n,但我不明白!来自internet的mod p.算法:
int result = 1;
for (int i = 1 ; i <= n ; i++)
{
result = (result * i ) % p;
}
cout<<result;
Let's say n = 3 , and p is 7.
When i = 1 , result = 1 % 7 ,
when i = 2 , result = (1%7 * 2) % 7 , and when i = 3 ,
result =((1%7*2) % 7 * 3) % 7.
int结果=1;
对于(int i=1;i而言,它们在数学上是相同的,但计算机用于表示数字的位数有限,如果超过该限制,则会得到意外的结果
请参见以下示例:
假设可以存储的最大值是200
,您想要计算X*Y%100
让我们为X
和Y
尝试一些值:
X=103和Y=98=>3*98>296溢出
X=103和Y=103=>3*3>9正常
在第二种情况下,如果在相乘之前取两者的模,则得到的结果低于200。但如果只取一个变量,则会得到309%200,但309将成为扭曲值,因为该类型最多只能表示200
在案例1中,您必须想出另一种策略(可能是更大的类型或将乘法转换为求和),因为乘法的结果将外推200极限。(a*b)%n==(a%n*b)%n
也是正确的。@IgorTandetnik你能解释一下为什么吗?根据余数的定义,a
可以表示为q*n+r
,其中q=floor(a/n)
和r=a%n
。然后a*b=(q*n+r)*b==n*q*b+r*b
。第一个分量显然可以被n
整除,所以a]%n=>(a%n*b)%n
.qedm在数学上是一样的。实际上,a*b可能会溢出您的整数类型,而(a%n)*(b%n)可能不会溢出。@cosmin andreiparaschiv更一般地说,如果a=x mod n
和b=y mod n
那么a*b=x*y mod n
,那么如果a%n=x%n
和b%n
%n
。您的表达式都是同一主题的变体。