কম্পিউটার টিউটোরিয়াল

সি++ প্রোগ্রাম: সোলোভে-স্ট্রাসেন (Solovay-Strassen) প্রাইম্যালিটি টেস্ট


সোলোভে-স্ট্রাসেন প্রাইম্যালিটি টেস্ট (Solovay-Strassen Primality Test) একটি সংখ্যা কম্পোজিট নাকি সম্ভাব্য প্রাইম কিনা তা টেস্ট করতে ব্যবহৃত হয়।

আলগরিদম

Begin
    Declare a function modulo of long datatype to perform binary calculation.
    Declare m_base, m_exp, m_mod of long datatype and pass as parameter.
    Declare two variables a, b of long datatype.
    Initialize a = 1, b = m_base.
    while (m_exp > 0) do
        if (m_exp % 2 == 1) then a = (a * b) % m_mod.
        b = (b * b) % m_mod.
        m_exp = m_exp / 2.
    Return a % m_mod.
End

Begin
    Declare a function Jacobian of int datatype to calculate Jacobian symbol.
    Declare CJ_a, CJ_n of long datatype and pass as parameter.
    if (!CJ_a) then return 0.
    Declare answer of integer datatype. Initialize answer = 1.
    if (CJ_a < 0) then CJ_a = -CJ_a. if (CJ_n % 4 == 3) then answer = -answer.
    if (CJ_a == 1) then return answer.
    while (CJ_a) do
        if (CJ_a < 0) then CJ_a = -CJ_a. if (CJ_n % 4 == 3) then answer = -answer.
        while (CJ_a % 2 == 0) do CJ_a = CJ_a / 2.
        if (CJ_n % 8 == 3 || CJ_n % 8 == 5) then answer = -answer.
        swap(CJ_a, CJ_n)
        if (CJ_a % 4 == 3 && CJ_n % 4 == 3) then answer = -answer.
        CJ_a = CJ_a % CJ_n.
        if (CJ_a > CJ_n / 2) then CJ_a = CJ_a - CJ_n.
    if (CJ_n == 1) then return answer.
End

Begin
    Declare a function Solovoystrassen of Boolean datatype.
    Declare SS_p of long datatype and itr of integer datatype as parameter.
    if (SS_p < 2) return false.
    if (SS_p != 2 && SS_p % 2 == 0) return false.
    for (int i = 0; i < itr; i++)
        long a = rand() % (SS_p - 1) + 1;
        long jacob = (SS_p + Jacobian(a, SS_p)) % SS_p;
        long mod = modulo(a, (SS_p - 1) / 2, SS_p);
        if (!jacob || mod != jacob) return false.
    return true.
End

উদাহরণ

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

long modulo(long m_base, long m_exp, long m_mod) {
    long a = 1;
    long b = m_base;
    while (m_exp > 0) {
        if (m_exp % 2 == 1)
            a = (a * b) % m_mod;
        b = (b * b) % m_mod;
        m_exp = m_exp / 2;
    }
    return a % m_mod;
}

int Jacobian(long CJ_a, long CJ_n) {
    if (!CJ_a) return 0;
    int answer = 1;
    if (CJ_a < 0) {
        CJ_a = -CJ_a;
        if (CJ_n % 4 == 3) answer = -answer;
    }
    if (CJ_a == 1) return answer;
    while (CJ_a) {
        if (CJ_a < 0) {
            CJ_a = -CJ_a;
            if (CJ_n % 4 == 3) answer = -answer;
        }
        while (CJ_a % 2 == 0) {
            CJ_a = CJ_a / 2;
            if (CJ_n % 8 == 3 || CJ_n % 8 == 5) answer = -answer;
        }
        swap(CJ_a, CJ_n);
        if (CJ_a % 4 == 3 && CJ_n % 4 == 3) answer = -answer;
        CJ_a = CJ_a % CJ_n;
        if (CJ_a > CJ_n / 2) CJ_a = CJ_a - CJ_n;
    }
    if (CJ_n == 1) return answer;
    return 0;
}

bool Solovoystrassen(long SS_p, int itr) {
    if (SS_p < 2) return false;
    if (SS_p != 2 && SS_p % 2 == 0) return false;
    for (int i = 0; i < itr; i++) {
        long a = rand() % (SS_p - 1) + 1;
        long jacob = (SS_p + Jacobian(a, SS_p)) % SS_p;
        long mod = modulo(a, (SS_p - 1) / 2, SS_p);
        if (!jacob || mod != jacob) return false;
    }
    return true;
}

int main() {
    int iter = 50;
    long num1, num2;
    cout << "Enter the first number: ";
    cin >> num1;
    cout << endl;
    if (Solovoystrassen(num1, iter))
        cout << num1 << " is a prime number\n" << endl;
    else
        cout << num1 << " is a composite number\n" << endl;
    cout << "Enter another number: ";
    cin >> num2;
    cout << endl;
    if (Solovoystrassen(num2, iter))
        cout << num2 << " is a prime number\n" << endl;
    else
        cout << num2 << " is a composite number\n" << endl;
    return 0;
}

আউটপুট

Enter the first number: 24
24 is a composite number
Enter another number: 23
23 is a prime number
  1. ফাংশন তৈরি করে প্রাইম নম্বর চেক করার C++ প্রোগ্রাম

  2. C++ প্রোগ্রাম: প্রাইম সংখ্যা (Prime Number) যাচাই

  3. পাইথন প্রোগ্রাম: কোনো সংখ্যা হ্যাপি নম্বর (Happy Number) কিনা চেক করা

  4. পাইথন প্রোগ্রাম: কোনো সংখ্যা ডিজেরিয়াম নম্বর (Disarium Number) কিনা চেক করা