📜  有序素数签名

📅  最后修改于: 2021-05-04 19:54:59             🧑  作者: Mango

给定数字n,找到有序素数签名,并使用该函数找到给定n的除数。
任何正整数’n’都可以以其主要因子的形式表示。如果’n’具有p 1 ,p 2 ,…等作为其主要因子,则n可以表示为:
n = {p_1}^{e1} * {p_2}^{e2} * ...
现在,以非降序排列获得的“ n”素数的指数。这样获得的排列称为正整数“ n”的有序素数签名
例子:

Input : n = 20
Output :  
The Ordered Prime Signature of 20 is : 
{ 1, 2 }
The total number of divisors of 20 is 6

Input : n = 13
Output :  
The Ordered Prime Signature of 13 is : 
{ 1 }
The total number of divisors of 13 is 2

解释 :

  1. 20 = 2^2 * 5^1,   20的有序素数签名= {1,2}
  2. 37 = 37^1,   37的有序素数签名= {1}
  3. 49 = 7^2,   有序素数49 = {2}

从上面的讨论可以确定1的素数是{1}。此外,所有素数都具有相同的签名,即{1}和一个数字的素数签名,即素数的k次幂(例如25,即5的2次幂)。 {k}。
例如 :

方法 :
1)找到数字的素因式分解
2)将与质因子相对应的每个指数存储在向量中
3)按升序对向量进行排序
4)向向量中存在的每个元素添加一个
5)将所有元素相乘

C++
// CPP to find total number of divisors of a
// number, using ordered prime signature
#include 
using namespace std;
 
// Finding primes upto entered number
vector primes(int n)
{
    bool prime[n + 1];
     
    // Finding primes by Sieve
    // of Eratosthenes method
    memset(prime, true, sizeof(prime));
     
    for (int i = 2; i * i <= n; i++)
    {
         
        // If prime[i] is not changed,
        // then it is prime
        if (prime[i] == true) {
             
            // Update all multiples of p
            for (int j = i * 2; j <= n; j += i)
                prime[j] = false;
        }
    }
     
    vector arr;
     
    // Forming array of the prime numbers found
    for (int i = 2; i <= n; i++)
    {
        if (prime[i])
            arr.push_back(i);
    }
    return arr;
}
 
// Finding ordered prime signature of the number
vector signature( int n)
{
    vector r = primes(n);
     
    // Map to store prime factors and
    // the related exponents
    map factor;
     
    // Declaring an iterator for map
    map::iterator it;
    vector sort_exp;
    int k, t = n;
    it = factor.begin();
     
    // Finding prime factorization of the number
    for (int i = 0; i < r.size(); i++)
    {
        if (n % r[i] == 0) {
            k = 0;
            while (n % r[i] == 0) {
                n = n / r[i];
                k++;
            }
             
            // Storing the prime factor and
            // its exponent in map
            factor.insert(it, pair(r[i], k));
             
            // Storing the exponent in a vector
            sort_exp.push_back(k);
        }
    }
     
    // Sorting the stored exponents
    sort(sort_exp.begin(), sort_exp.end());
     
    // Printing the prime signature
    cout << " The Ordered Prime Signature of " <<
         t << " is : \n{ ";
          
    for (int i = 0; i < sort_exp.size(); i++)
    {
        if (i != sort_exp.size() - 1)
            cout << sort_exp[i] << ", ";
        else
            cout << sort_exp[i] << " }\n";
    }
    return sort_exp;
}
 
// Finding total number of divisors of the number
void divisors(int n)
{
    int f = 1, l;
    vector div = signature(n);
    l = div.size();
     
    // Adding one to each element present
    for (int i = 0; i < l; i++)
    {
         
        // in ordered prime signature
        div[i] += 1;
         
        // Multiplying the elements
        f *= div[i];
    }
    cout << "The total number of divisors of " <<
          n << " is " << f << "\n";
}
 
// Driver Method
int main()
{
    int n = 13;
    divisors(n);
    return 0;
}


Java
// JAVA to find total number of divisors of a
// number, using ordered prime signature
import java.util.*;
 
class GFG
{
    static class pair
    {
        int first, second;
        public pair(int first, int second) 
        {
            this.first = first;
            this.second = second;
        }   
    }
 
// Finding primes upto entered number
static Vector primes(int n)
{
    boolean []prime = new boolean[n + 1];
     
    // Finding primes by Sieve
    // of Eratosthenes method  
    Arrays.fill(prime, true);
     
    for (int i = 2; i * i <= n; i++)
    {
         
        // If prime[i] is not changed,
        // then it is prime
        if (prime[i] == true) {
             
            // Update all multiples of p
            for (int j = i * 2; j <= n; j += i)
                prime[j] = false;
        }
    }   
    Vector arr = new Vector<>();
     
    // Forming array of the prime numbers found
    for (int i = 2; i <= n; i++)
    {
        if (prime[i])
            arr.add(i);
    }
    return arr;
}
 
// Finding ordered prime signature of the number
static Vector signature( int n)
{
    Vector r = primes(n);
     
    // Map to store prime factors and
    // the related exponents
    HashMap factor = new HashMap<>();
     
    // Declaring an iterator for map
  //  HashMap::iterator it;
    Vector sort_exp = new Vector<>();
    int k, t = n;
    int it = 0;
     
    // Finding prime factorization of the number
    for (int i = 0; i < r.size(); i++)
    {
        if (n % r.get(i) == 0)
        {
            k = 0;
            while (n % r.get(i) == 0)
            {
                n = n / r.get(i);
                k++;
            }
             
            // Storing the prime factor and
            // its exponent in map
            factor.put(r.get(i), k);
             
            // Storing the exponent in a vector
            sort_exp.add(k);
        }
    }
     
    // Sorting the stored exponents
    Collections.sort(sort_exp);
     
    // Printing the prime signature
    System.out.print(" The Ordered Prime Signature of " + 
         t+ " is : \n{ ");
          
    for (int i = 0; i < sort_exp.size(); i++)
    {
        if (i != sort_exp.size() - 1)
            System.out.print(sort_exp.get(i) + ", ");
        else
            System.out.print(sort_exp.get(i) + " }\n");
    }
    return sort_exp;
}
 
// Finding total number of divisors of the number
static void divisors(int n)
{
    int f = 1, l;
    Vector div = signature(n);
    l = div.size();
     
    // Adding one to each element present
    for (int i = 0; i < l; i++)
    {
         
        // in ordered prime signature
        //div[i] += 1;
         
        // Multiplying the elements
        f *= (div.get(i) + 1);
    }
    System.out.print("The total number of divisors of " + 
          n + " is " +  f + "\n");
}
 
// Driver code
public static void main(String[] args)
{
    int n = 13;
    divisors(n);
}
}
 
// This code is contributed by aashish1995


C#
// C# to find total number
// of divisors of a number,
// using ordered prime signature
using System;
using System.Collections.Generic;
 
class GFG
{
    // Finding primes
    // upto entered number
    static List primes(int n)
    {
        bool []prime = new bool[n + 1];
         
        // Finding primes by Sieve
        // of Eratosthenes method
        for (int i = 0; i < n + 1; i++)
            prime[i] = true;
         
        for (int i = 2; i * i <= n; i++)
        {
             
            // If prime[i] is not 
            // changed, then it is prime
            if (prime[i] == true)
            {
                 
                // Update all multiples of p
                for (int j = i * 2;
                         j <= n; j += i)
                    prime[j] = false;
            }
        }
         
        List arr = new List();
         
        // Forming array of the
        // prime numbers found
        for (int i = 2; i <= n; i++)
        {
            if (prime[i])
                arr.Add(i);
        }
        return arr;
    }
     
    // Finding ordered prime
    // signature of the number
    static List signature( int n)
    {
        List r = primes(n);
         
        // Map to store prime factors
        // and the related exponents
        var factor = new Dictionary();
         
        List sort_exp = new List();
        int k, t = n;
         
        // Finding prime factorization
        // of the number
        for (int i = 0; i < r.Count; i++)
        {
            if (n % r[i] == 0)
            {
                k = 0;
                while (n % r[i] == 0)
                {
                    n = n / r[i];
                    k++;
                }
                 
                // Storing the prime factor
                // and its exponent in map
                factor.Add(r[i], k);
                 
                // Storing the exponent
                // in a List
                sort_exp.Add(k);
            }
        }
         
        // Sorting the
        // stored exponents
        sort_exp.Sort();
         
        // Printing the
        // prime signature
        Console.Write(" The Ordered Prime Signature of " +
                                        t + " is : \n{ ");
             
        for (int i = 0; i < sort_exp.Count; i++)
        {
            if (i != sort_exp.Count - 1)
                Console.Write(sort_exp[i] + ", ");
            else
                Console.Write(sort_exp[i] + " }\n");
        }
        return sort_exp;
    }
     
    // Finding total number
    // of divisors of the number
    static void divisors(int n)
    {
        int f = 1, l;
        List div = signature(n);
        l = div.Count;
         
        // Adding one to each
        // element present
        for (int i = 0; i < l; i++)
        {
             
            // in ordered
            // prime signature
            div[i] += 1;
             
            // Multiplying
            // the elements
            f *= div[i];
        }
        Console.Write("The total number of divisors of " +
                                   n + " is " + f + "\n");
    }
     
    // Driver Code
    static void Main()
    {
        int n = 13;
        divisors(n);
    }
}
 
// This code is contributed by
// Manish Shaw(manishshaw1)


输出:
The Ordered Prime Signature of 13 is : 
{ 1 }
The total number of divisors of 13 is 2

应用 :
查找数字的有序素数签名可用于查找除数。实际上,可以从该数字的有序素数中推断出一个数字的除数总数。为此,只需在有序素数签名中的每个元素上添加一个,然后将这些元素相乘即可。由此获得的乘积给出了该数目的除数的总数(包括1和该数目本身)。