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

开启你的职业生涯

完成课程获得认证

开始学习
广告