簡體   English   中英

N! 模算法

[英]N! modulo algorithm

因此,根據我在互聯網上閱讀的內容,模可以做到這一點:

(a*b) % n = (a % n * b % n)%n;

我明白,因為 a%n * b%n 可以大於 n,所以我們必須再次取模 n。但我沒有得到 n。 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.

我真的看不出我的第一個陳述和這個結果之間的聯系。 From what i see, for n = 2, n, % 7 should be (1 % 7 * 2 % 7 ) % 7: not as the algorithm would do it.(1 % 7 * 2 ) % 7.我知道算法是對的,我錯過了一些東西......有人可以幫助我嗎?

從數學上講,它們是相同的,但計算機用於表示數字的位數有限,如果超出該限制,您將得到意想不到的結果。

請參見以下示例:

想象一下可以存儲的最大值是200並且您想要計算X * Y % 100

讓我們嘗試一些XY的值:

  1. X = 103 and Y = 98 ==> 3 * 98 > 296 OVERFLOW
  2. X = 103 and Y = 103 ==> 3 * 3 > 9 OK

在情況 2 中,如果你在相乘之前取兩者的模數,你會得到低於 200 的結果。但如果你只取一個變量,你會得到 309 % 200,但 309 會變成一些扭曲的值,因為類型只能表示最多 200 個。

在第一種情況下,您將不得不提出另一種策略(可能是更大的類型或將您的乘法轉換為總和),因為乘法的結果會推斷出 200 的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM