C/C++ 模方程解的個數程式?


在數學中,**模方程**是由*模*滿足的代數方程,指的是模問題中的模。也就是說,給定模空間上的一些函式,模方程是在這些函式之間成立的方程,或者換句話說,是模的恆等式。

術語*模方程*最常見的用法是與橢圓曲線的模問題相關的。在這種情況下,模空間本身是一維的。這意味著模曲線函式域中的任意兩個有理函式*F*和*G*都將滿足模方程*P(F, G) = 0*,其中*P*是複數上兩個變數的非零多項式。對於合適的非退化選擇F和*G*,方程*P(X,Y) = 0*實際上將定義模曲線。

你剛剛看到了一種奇怪的數學表示式,形式為

B ≡ (A mod X)

這意味著B與A模X同餘。讓我們舉個例子:

21 ≡ 5(mod 4)

符號≡表示“等價”。在上式中,21和5是等價的。這是因為21模4 = 1等於5模4 = 1。另一個例子是51 ≡ 16(mod 7)

在這個問題中,我們有兩個整數a和b,我們必須找到滿足模方程(A mod X)=B的可能的x值的數量,其中X是模方程的解。

例如

Input: A = 26, B = 2
Output: X can take 6 values

解釋

X可以等於{3, 4, 6, 8, 12, 24}中的任何一個,因為A模這些值的任何一個都等於2,即**(26 mod 3) = (26 mod 4) = (26 mod 6) = (26 mod 8) = .... = 2**

我們有方程A mod X = B

條件

如果(A = B),則將有無限多個值,其中A始終大於X。

如果(A < B),則X不可能滿足模方程。

現在只剩下最後一種情況(A > B)。

現在,在這種情況下,我們將使用關係

被除數 = 除數 * 商 + 餘數

給定A(被除數)和B(餘數),X即為除數。

現在

A = X * 商 + B

設商用Y表示

∴ A = X * Y + B

A - B = X * Y


∴為了得到Y的整數值,

我們需要取所有X,使得X整除(A - B)


∴ X是(A - B)的約數

找到(A – B)的約數是主要問題,而這些約數的個數就是X可以取的可能值。

我們知道A mod X解的值將是從(0到X – 1),取所有滿足X > B的X。

這樣我們可以得出結論,(A – B)的約數個數大於B,所有可能的X值都可以滿足A mod X = B。

例子

#include <iostream>
#include <math.h>
using namespace std;
int Divisors(int A, int B) {
   int N = (A - B);
   int D = 0;
   for (int i = 1; i <= sqrt(N); i++) {
      if ((N % i) == 0) {
         if (i > B)
            D++;
         if ((N / i) != i && (N / i) > B)
            D++;
      }
   }
   return D;
}
int PossibleWaysUtil(int A, int B) {
   if (A == B)
      return -1;
   if (A < B)
      return 0;
   int D = 0;
   D = Divisors(A, B);
   return D;
}
int main() {
   int A = 26, B = 2;
   int Sol = PossibleWaysUtil(A, B);
   if (Sol == -1) {
      cout <<" X can take Infinitely many values greater than " << A << "\n";
   } else {
      cout << " X can take " << Sol << " values\n";
      return 0;
   }
}

更新於:2019年8月19日

瀏覽量:339

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.