Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ N模算法_C++_Math_Modulo - Fatal编程技术网

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
    。您的表达式都是同一主题的变体。