Sgu 200. Cracking RSA (Gaussian elimination element + high precision)

Source: Internet
Author: User
Tags integer numbers

Given M integers, all the factors exist in the first t prime numbers. Ask how many subsets are there, and their product is the number of workers.

Solution:

The number of distinct values indicates that the index of each prime factor is an even number.
Create an equation for each prime factor. Returns the linear equations of mod 2.
The number of free variables for solving this equations is 2 ^ p-1. (-1 is the case where the empty set is removed)

Note that a high-precision algorithm is required because 2 ^ P is out of the data range.

200. Cracking rsatime limit per test: 0.25 sec.
Memory limit per test: 65536 kbinput: Standard
Output: Standard


The following problem is somehow related to the final stage of your famous integer factorization algorithms involved in some cryptoanalytical problems, for example cracking well-known RSA public key system.

The most powerful of such algorithms, so called quadratic sieve descendant algorithms, utilize the fact that if n = PQ where p and q are large unknown primes needed to be found out, then if v2 = W2 (mod N), u =v (mod N) and U =- V (mod N), then gcd (V + W, n) is a factor of N (either P or Q ).

Not getting further in the details of these algorithms, let us consider our problem. given M integer numbers b1, b2 ,..., BM such that all their prime factors are from the set of first t primes, the task is to find such a subset S of {1, 2 ,..., m} that product of Bi for I from S is a perfect square I. e. equal to U2 for some integer U. given such s we get one pair for testing (product of S elements stands for V when W is known from other steps of algorithms which are of no interest to us, testing completed MED is checking whether pair is nontrivial, I. e. U = V (mod N) and U =-V (mod n )). since we want to factor n with maximum possible probability, we wowould like to get as your such sets as possible. so the interesting problem cocould be to calculate the number of all such sets. this is exactly your task.

Input
The first line of the input file contains two integers t and M (1 ≤ T ≤ 100, 1 ≤ m ≤ 100 ). the second line of the input file contains M integer numbers Bi such that all their prime factors are from t First Primes (for example, if t = 3 all their prime factors are from the set {2, 3, 5 }). 1 ≤ Bi ≤109 for all I.

Output
Output the number of non-empty subsets of the given set {bi}, the product of numbers from which is a perfect square


Sample test (s)
Input
3 4 9 20 500 3 Output 
 

3
[Submit]
#include <algorithm>#include <iostream>#include <stdlib.h>#include <string.h>#include <iomanip>#include <stdio.h>#include <string>#include <queue>#include <cmath>#include <stack>#include <map>#include <set>#define eps 1e-10///#define M 1000100#define LL __int64///#define LL long long///#define INF 0x7ffffff#define INF 0x3f3f3f3f#define PI 3.1415926535898#define zero(x) ((fabs(x)<eps)?0:x)const int maxn = 210;using namespace std;bool f[maxn+1000];int k[maxn+1000];int a[maxn][maxn];int num[maxn];int equ, var;char str1[maxn], str2[maxn];void Add(char a[], char b[], char c[]){    int len1 = strlen(a);    int len2 = strlen(b);    int n = max(len1, len2);    int add = 0;    for(int i = 0; i < n; i++)    {        int cnt = 0;        if(i < len1) cnt += a[i]-'0';        if(i < len2) cnt += b[i]-'0';        cnt += add;        add = cnt/10;        c[i] = cnt%10+'0';    }    if(add) c[n++] = add+'0';    c[n] = 0;}void Sub_1(char a[]){    int s = 0;    while(a[s] == '0') s++;    a[s]--;    for(int i = 0; i < s; i++)        a[i] = '9';    int len = strlen(a);    while(len > 1 && a[len-1] == '0') len--;    a[len] = 0;}void Prime(){    int t = 0;    memset(f, false, sizeof(f));    for(int i = 2; i <= 1005; i++)    {        if(!f[i])            k[t++] = i;        for(int j = 0; j < t; j++)        {            if(i*k[j] > 1005)                break;            f[i*k[j]] = true;            if(i%k[j] == 0)                break;        }    }}int Gauss(){    int row, col;    int max_r;    row = col = 0;    while(row < equ && col < var)    {        max_r = row;        for(int i = row+1; i < equ; i++)        {            if(a[i][col]) max_r = i;        }        if(a[max_r][col] == 0)        {            col++;            continue;        }        if(max_r != row)        {            for(int j = col; j <= var; j++) swap(a[max_r][j], a[row][j]);        }        for(int i = row+1; i < equ; i++)        {            if(a[i][col] == 0) continue;            for(int j = col; j <= var; j++) a[i][j] ^= a[row][j];        }        col++;        row++;    }    return var-row;}int main(){    Prime();    int n, m;    while(cin >>n>>m)    {        memset(a, 0, sizeof(a));        for(int i = 0; i < m; i++) cin >>num[i];        equ = n;        var = m;        for(int i = 0; i < n; i++)        {            for(int j = 0; j < m; j++)            {                int ans = 0;                while(num[j]%k[i] == 0)                {                    ans ++;                    num[j]/=k[i];                }                if(ans%2) a[i][j] = 1;            }        }        int N = Gauss();        strcpy(str1, "1");        for(int i = 0; i < N; i++)        {            Add(str1, str1, str2);            strcpy(str1, str2);        }        Sub_1(str1);        for(int i = strlen(str1)-1; i >= 0; i--) cout<<str1[i];        cout<<endl;    }    return 0;}


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.