关于质因数,分解质因数

质因数(素因数或质因子):在数论里是指能整除给定正整数的质数。

互质:除了1以外,两个没有其他共同质因子的正整数称为互质。

           因为1没有质因子,1与任何正整数(包括1本身)都是互质。

正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式 。只有一个质因子的正整数为质数。
每个合数都可以写成几个质数(也可称为素数)相乘的形式 ,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数;而这个因数一定是一个质数。

分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示                        出来,叫做分解质因数。如30=2×3×5 。、

                      分解质因数只针对合数。

分解质因数的方法有两种:

1、相乘法

写成几个质数相乘的形式(这些不重复的质数即为质因数),实际运算时可采用逐步分解的方式。

如:36=2*2*3*3 运算时可逐步分解写成36=4*9=2*2*3*3或3*12=3*2*2*3

2、短除法

从最小的质数除起,一直除到结果为质数为止。分解质因数的算式的叫短除法。

短除法求最大约数,先用这几个数的公约数连续去除,一直除到所有的商互质为止,然
后把所有的除数连乘起来,所得的积就是这几个数的最大公约数。例如,求24、48、60的最大公约数24、48、60=2×3×2=12
短除法求最小公倍数,先用这几个数的公约数去除每一个数,再用部分数的公约数去除,并把不能整除的数移下来,一直除        到所有的商中每两个数都是互质的为止,然后把所有的除数和商连乘起来,所得的积就是这几个数的最小公倍数,例如,求    12、   5、18的最小公倍数。(12、15、18)=3×2×2×5×3=180

求最大公约数和最小公倍数:

短除法:

å¬çº¦æ°åå¬åæ°

短除符号就是除号倒过来。短除就是在除法中写除数的地方写两个数共有的质因数,然后落下两个数被公有质因数整除的商,之后再除,以此类推,直到结果互质为止(两个数互质)。

而在用短除计算公倍数数时,对其中任意两个数存在的因数都要算出,其它没有这个因数的数则原样落下。直到剩下每两个都是互质关系。

求最大公约数便乘一边,求最小公倍数便乘一圈。

(公约数:亦称“公因数”。是几个整数同时均能整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。)

分解质因数法:

把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是
这几个数的最大公约数。例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,
所以,(24、60)=12。
把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。

Pollard Rho因数分解

1975年,John M. Pollard提出了第二种因数分解的方法,Pollard Rho快速因数分解。该算法时间复杂度为

 。

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
    int n;
    printf("请输入一个数字n=");
    scanf("%d",&n);
    printf("分解质因数:");
   for(int i=2;i<=n;i++)
   {
       while(n!=i)//如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
       {
           if(n>i&&n%i==0)//如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n,重复执行第一步。
           {
               printf("%d*",i);
               n=n/i;
           }
           else//如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
            break;
       }
   }
   printf("%d",n);
   return 0;
}
#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
    int n;
    printf("请输入一个数字n=");
    scanf("%d",&n);
    printf("分解质因数:");
   for(int i=2;i<=sqrt(n);i++)
   {
      if(n%i==0)
      {
          n/=i;
          printf("%d*",i);
          i--;
      }
   }
   printf("%d",n);
   return 0;
}

博客里面的一些定义等东西来自于百度词条。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值