📜  主要方面

📅  最后修改于: 2021-05-04 12:53:13             🧑  作者: Mango

质数因子是给定数的因子,即素数。因子是您将数字相乘得到另一个数字的方法。简而言之,素数因子就是找出哪些素数相乘以构成原始数。
示例: 15的素数是3和5(因为3×5 = 15,而3和5是素数)。

关于Prime Factor的一些有趣事实:

  1. 对于任何数量,只有一组(唯一!)素数因子。
  2. 为了保持唯一素数分解的这一特性,必须将数字1既不是素数也不是复合数。
  3. 素因式分解可以帮助我们进行除数运算,简化分数并找到分数的公共分母。
  4. Pollard的Rho是素数分解算法,对于具有较小素数的大量复合数尤其快速。
  5. 密码学是对密码的研究。素数分解对于尝试根据数字创建(或破坏)密码的人们非常重要。

如何打印数字的素数?
天真的解决方案:
给定数字n,编写一个函数打印n的所有素数。例如,如果输入数字为12,则输出应为“ 2 2 3”,如果输入数字为315,则输出应为“ 3 3 5 7”。
以下是查找所有主要因素的步骤:

  1. n被2整除时,打印2并将n除以2。
  2. 步骤1之后, n必须为奇数。现在从i = 3到n的平方根开始循环。当in时,打印i并将n除以i ,再将i除以2并继续。
  3. 如果n是质数且大于2,那么经过以上两个步骤, n不会变为1。因此,如果大于2,则打印n
C/C++
// Program to print all prime factors 
# include  
# include  
    
// A function to print all prime factors of a given number n 
void primeFactors(int n) 
{ 
    // Print the number of 2s that divide n 
    while (n%2 == 0) 
    { 
        printf("%d ", 2); 
        n = n/2; 
    } 
    
    // n must be odd at this point.  So we can skip  
    // one element (Note i = i +2) 
    for (int i = 3; i <= sqrt(n); i = i+2) 
    { 
        // While i divides n, print i and divide n 
        while (n%i == 0) 
        { 
            printf("%d ", i); 
            n = n/i; 
        } 
    } 
    
    // This condition is to handle the case when n  
    // is a prime number greater than 2 
    if (n > 2) 
        printf ("%d ", n); 
} 
    
/* Driver program to test above function */
int main() 
{ 
    int n = 315; 
    primeFactors(n); 
    return 0; 
}


Java
// Program to print all prime factors
import java.io.*;
import java.lang.Math;
  
class GFG {
    // A function to print all prime factors
    // of a given number n
    public static void primeFactors(int n)
    {
        // Print the number of 2s that divide n
        while (n % 2 == 0) {
            System.out.print(2 + " ");
            n /= 2;
        }
  
        // n must be odd at this point.  So we can
        // skip one element (Note i = i +2)
        for (int i = 3; i <= Math.sqrt(n); i += 2) {
            // While i divides n, print i and divide n
            while (n % i == 0) {
                System.out.print(i + " ");
                n /= i;
            }
        }
  
        // This condition is to handle the case whien
        // n is a prime number greater than 2
        if (n > 2)
            System.out.print(n);
    }
  
    public static void main(String[] args)
    {
        int n = 315;
        primeFactors(n);
    }
}


Python
# Python program to print prime factors
  
import math
  
# A function to print all prime factors of 
# a given number n
def primeFactors(n):
      
    # Print the number of two's that divide n
    while n % 2 == 0:
        print 2,
        n = n / 2
          
    # n must be odd at this point
    # so a skip of 2 ( i = i + 2) can be used
    for i in range(3, int(math.sqrt(n))+1, 2):
          
        # while i divides n, print i ad divide n
        while n % i == 0:
            print i,
            n = n / i
              
    # Condition if n is a prime
    # number greater than 2
    if n > 2:
        print n
          
# Driver Program to test above function
  
n = 315
primeFactors(n)
  
# This code is contributed by Harshit Agrawal


C#
// C# Program to print all prime factors
using System;
  
namespace prime {
public class GFG {
  
    // A function to print all prime
    // factors of a given number n
    public static void primeFactors(int n)
    {
        // Print the number of 2s that divide n
        while (n % 2 == 0) {
            Console.Write(2 + " ");
            n /= 2;
        }
  
        // n must be odd at this point. So we can
        // skip one element (Note i = i +2)
        for (int i = 3; i <= Math.Sqrt(n); i += 2) {
            // While i divides n, print i and divide n
            while (n % i == 0) {
                Console.Write(i + " ");
                n /= i;
            }
        }
  
        // This condition is to handle the case whien
        // n is a prime number greater than 2
        if (n > 2)
            Console.Write(n);
    }
  
    // Driver Code
    public static void Main()
    {
        int n = 315;
        primeFactors(n);
    }
}
}
  
// This code is contributed by Sam007


PHP
 2)
        echo $n, " ";
}
  
    // Driver Code
    $n = 315;
    primeFactors($n);
  
// This code is contributed by aj_36
?>


Javascript


输出:

3 3 5 7

这是如何运作的?

  • 第1步和第2步处理复合数,第3步处理质数。为了证明完整的算法有效,我们需要证明步骤1和2实际上处理了复合数。
    显然,第一步处理的是偶数。在步骤1之后,所有剩余的质数因子必须为奇数(两个质数因子的差必须至少为2),这解释了为什么我将i递增2。
  • 现在最主要的是,循环运行到n的平方根。为了证明这种优化有效,让我们考虑以下合成数字的属性。
  • 可以使用计数器语句证明此属性。令a和b为n的两个因数,使得a * b = n。如果两者均大于√n,则ab>√n,*√n,这与表达式“ a * b = n”相矛盾。
  • 在上述算法的第2步中,我们运行一个循环并执行以下操作-
    • 找到最小素数因子i(必须小于√n,)
    • 重复将n除以i,从n中删除所有出现的i。
    • 重复步骤a和b,除以n,i = i +2。重复步骤a和b,直到n变为1或质数。

高效的解决方案:

  • 使用Sieve O(log n)进行质因子分解以进行多个查询

程序来找到一个数的素数

  • 阵列产品的主要因素
  • 给定数的第N个素数
  • 程序可成对打印多个因子
  • 前n个自然数的不同素数的数量
  • 多个独特素数的乘积

与Prime Factor有关的更多问题

  • 计算主要因子分别为2和3的范围内的数字
  • 两个数的共同素数
  • 直到n的数字的最小素因数
  • 数的最小除数
  • 使用素数分解的数的因子之和
  • 数字总和等于其所有素数的数字总和的数字
  • 在M到N范围内具有最大不同素数的最大数量的数字

最近关于素数的文章!