Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C/C++ สำหรับจำนวนคำตอบของสมการโมดูลาร์?


ในวิชาคณิตศาสตร์ สมการแบบแยกส่วน เป็นสมการพีชคณิตที่พอใจโดย moduli ในแง่ของปัญหามอดูลี กล่าวคือ เมื่อให้ฟังก์ชันจำนวนหนึ่งบนสเปซโมดูลี สมการแบบแยกส่วนคือสมการที่ยึดระหว่างฟังก์ชันเหล่านี้ หรืออีกนัยหนึ่งคือเอกลักษณ์ของมอดูลี

การใช้คำว่า สมการแบบแยกส่วน . บ่อยที่สุด เกี่ยวข้องกับปัญหาโมดูลีของเส้นโค้งวงรี ในกรณีนั้น โมดูลีสเปซเองนั้นเป็นมิติหนึ่ง นั่นก็หมายความว่าฟังก์ชันตรรกยะสองฟังก์ชัน F และ G ในช่องฟังก์ชันของเส้นโค้งโมดูลาร์ จะเป็นไปตามสมการโมดูลาร์ P(F, G) =0 กับ P พหุนามที่ไม่ใช่ศูนย์ของตัวแปรสองตัวทับจำนวนเชิงซ้อน สำหรับทางเลือกที่ไม่เสื่อมคุณภาพที่เหมาะสมของ F และ G , สมการ P(X,Y) =0 จะกำหนดเส้นโค้งแบบแยกส่วนได้จริง

คุณเพิ่งเห็นนิพจน์ทางคณิตศาสตร์แปลก ๆ ของแบบฟอร์ม

B ≡ (ตัวดัดแปลง X)

นี่บอกว่า B เท่ากันกับ A โมดูโล X ลองมาดูตัวอย่างกัน

21 ≡ 5( สมัย 4)

เทียบเท่าสัญลักษณ์หมายถึง "ความเท่าเทียมกัน" ในสมการข้างต้น 21 และ 5 มีค่าเท่ากัน นี่เป็นเพราะว่า 21 โมดูโล 4 =1 เท่ากับ 5 โมดูโล 4 =1 อีกตัวอย่างหนึ่งคือ 51 ≡ 16( mod 7)

ในปัญหานี้ เรามีจำนวนเต็ม a และ b สองจำนวน และเราต้องค้นหาจำนวนค่าที่เป็นไปได้ x ที่เป็นไปตามสมการโมดูลาร์ (A mod X)=B โดยที่ X แก้สมการของสมการโมดูลาร์

ตัวอย่าง

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

คำอธิบาย

X สามารถเท่ากับค่าใดๆ ของ {3, 4, 6, 8, 12, 24} เนื่องจากโมดูลัส A ค่าใดๆ เหล่านี้เท่ากับ 2 i e., (26 mod 3) =(26 mod 4) =(26 mod 6) =(26 mod 8) =.... =2

เรามีสมการ A mod X =B

เงื่อนไข

ถ้า (A =B) จะมีค่ามากมายเป็นอนันต์ โดยที่ A จะมากกว่า X เสมอ

ถ้า (A

ตอนนี้เหลือเพียงกรณีสุดท้ายที่ (A> B)

ในกรณีนี้ เราจะใช้ความสัมพันธ์

เงินปันผล =ตัวหาร * ผลหาร + ส่วนที่เหลือ

X คือตัวหารที่ได้รับ A คือเงินปันผลและ B คือเศษส่วน

ตอนนี้

A =X * ผลหาร + B

ให้ Quotient แสดงเป็น 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 ดังกล่าวทั้งหมดมาที่ X> B.

ด้วยวิธีนี้ เราสามารถสรุปได้โดยบอกว่าจำนวนตัวหารของ (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;
   }
}