有没有办法用一些素数的乘法来分割数字

时间:2012-10-24 10:42:08

标签: algorithm primes

我正在寻找一种能帮我分割数字 N 的算法 N =(p 1 a (p 2 b ... .. *(p n z

,其中

N is the given number
p is prime numbers smallest to greatest
a,b,..z are the power over the prime
* is the multiplication operation

3 个答案:

答案 0 :(得分:5)

它被称为分解。谷歌的关键词:prime factorization algorithm

问题是,我们仍然无法快速做到这一点。它为密码学提供了很好的基础(例如RSA算法)。

祝你好运!

答案 1 :(得分:1)

如果我们不关心时间优化,这不是一个如此复杂的问题!以下是有效的简单代码。

#include<iostream>
#include<vector>
#include<map>
#include<cmath>

using namespace std;

int get_primes(int max_number, vector<int> &primes)
{
    int *table = new int[max_number + 1];

    memset(table, -1, sizeof(int) * (max_number + 1));

    table[0] = table[1] = 0;

    primes.clear();

    for(int i = 2;i<=max_number ;i++)
    {
        if(table[i])
        {
            primes.push_back(i);
            for(int j = i * i;j<=max_number;j+=i)
            {
                table[j] = 0;
            }
        }
    }

    delete [] table;
    return primes.size();
}

int get_prime_factor(int number, map<int , int> &factors)
{
    vector<int> primes;
    get_primes(number,primes);

    factors.clear(); 
    int ret = 0;
    for(int i = 0;primes[i] <= number;)
    {
        if(number % primes[i] == 0)
        {
            ret ++;
            factors[primes[i]] ++;
            number /= primes[i];
        }
        else
            i++;
    } 
    return ret;
}

int main()
{
    cout<<"Please input a number:"<<endl;
    int number;

    cin>>number;

     map<int , int> factors;
     get_prime_factor(number,factors);


    for(map<int,int>::iterator itr= factors.begin();itr != factors.end();++itr)
    {
            cout<<"("<<itr->first<<"**"<<itr->second<<")";
    }

    cout<<endl;
    getchar();
    getchar();
    return 0;

}

希望它有所帮助!

答案 2 :(得分:1)

有许多算法可用于分解整数:试验分割,Pollard的rho算法,椭圆曲线,二次筛等。谷歌搜索其中一些主题将有所帮助。为了帮助您入门,这里有一个通过试验分解的算法:

function td_factors(n)
    f = 2
    while f * f <= n
        if n % f == 0
            output f
            n /= f
        else
            f = f + 1
    output n

为了进一步阅读,我在我的博客上谦虚地推荐essay