首页 > 编程语言 >素数有关基本算法

素数有关基本算法

时间:2023-01-09 19:47:21浏览次数:38  
标签:基本 prime 筛法 int 合数 算法 素数 质因数

该文章包含模块为判断素数,分解质因数,筛素数三大模块

  • 判断素数

  • 我们最容易想到的素数判断就是试除法,就是枚举从2到n-1中所有的数,尝试从其中找到n的因数,找到了就是合数,反之则为素数,实践复杂度为O(n)。
  • 然而我们很容易发现该方法重复了许多无用的步骤,比如很明显的n-1就很难是n的因数,我们可以尝试从其中找出那些重复的数。
  • 我们想到,如果一个数是合数,那么因数一定是成对出现的,并且似乎是“均匀”地分布在根号n两侧,那么我们就可以大大减少重复的次数
  •  1 bool is_prime(int n){
     2     
     3     if(n<2)return false;
     4     
     5     for(int i=2;i<=n/i;i++){
     6         if(n%i==0)return false;
     7     }
     8     
     9     return true;
    10 }

     

  • 分解质因数

  • 如果我们想找到一个合数的质因数及其幂,那么我们只需要简单的利用以下程序
  •  1 void prime(int n){
     2     
     3     for(int i=2;i<=n/i;i++){
     4         
     5         if(n%i==0){
     6             int s=0;
     7             while(n%i==0){
     8                 n/=i;
     9                 s++;
    10             }
    11             printf("%d %d\n",i,s);
    12         }
    13         
    14     }
    15     
    16     if(n>1)printf("%d 1\n",n);
    17     puts("");
    18 }

    比较好理解,不做过多讲解

  • 筛素数

  • 现在试想我们想从1-n中将所有素数筛选出来并找到其个数,我们不可能对于每个数都用一遍暴力判断和优化判断,即使是优化判断的实践复杂度也是可想而知的高,这里,我们可以不妨考虑将所有的合数筛出来,那么剩下的数就是素数。
  • 下面分为埃氏筛法和欧式筛法,其中在n的量级较大时(>=1e6),后者比前者快得多,虽然两者耗时都不长。
  • 埃氏筛法————
  • 基本思路是利用合数可以分解为质因数之积的原理,我们利用已经筛出的素数筛掉合数,时间复杂度为nln(n)
  •  1 void find_prime(int n){
     2     
     3     if(n<2)return;
     4     
     5     for(int i=2;i<=n;i++){
     6         if(!st[i]){
     7             cnt++;
     8             for(int j=i+i;j<=n;j+=i){
     9                 st[j]=true;
    10             }
    11         }
    12     }
    13 }

     

  • 欧式筛法————
  • 我们从上面的埃氏筛法可以看到,尽管上面的筛法看起来已经优化了不少,我们还是可以从中看到其中有许多合数被重复筛掉,欧式筛法恰恰可以避免这种情况,以至于我们的时间是线性的
  •  1 void find_prime(int n){
     2     
     3     if(n<2)return;
     4     
     5     for(int i=2;i<=n;i++){
     6         
     7         if(!st[i])prime[cnt++]=i;
     8         
     9         for(int j=0;prime[j]<=n/i;j++){
    10             st[prime[j]*i]=true;
    11             if(i%prime[j]==0)break;
    12         }
    13     }
    14 }

     

标签:基本,prime,筛法,int,合数,算法,素数,质因数
From: https://www.cnblogs.com/hamster-er/p/17038353.html

相关文章

  • ABB 800XA学习笔记3:基本配置
    下面的内容我在新浪博客也发表过,地址是ABB80XA学习笔记03:基本配置_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里记录一遍,以免丢失。这边笔记生成的时候,我刚刚开始学习......
  • jQuery基本选择器
    id选择器//选择id为one的元素$('#btn1').click(function(){$('#one').css("background","#bfa");});.class选择器//选择class为mini的所有元......
  • NGINX基本编译安装和配置绑定域名或者默认路径页面
    tar-xvfnginx-1.21.4.tar.gzlscdnginx-1.21.4lsyum-yinstallpcrepcre-develyum-yinstallopenssl-devel#也可以去掉-add-module的东西./configure--user=nginx-......
  • 代码随想录算法训练营第13天
    今日刷题2道:239.滑动窗口最大值,347.前K个高频元素。● 239.滑动窗口最大值题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%......
  • 普通家庭网络两台基本千兆路由器组网实现同WiFi名同密码
    普通家庭网络两台基本千兆路由器组网实现同WiFi名同密码准备工作:1.确认家里的两台路由器属于基础入门版路由器,如小米A4,支持IPv6,同时带有5Ghz的频段,不支持mesh组网模式(mes......
  • 【算法原理】矩阵乘法
    【算法原理】矩阵乘法一般是矩阵乘法+快速幂,结合\(dp\)普通矩阵乘法:矩阵乘法有结合律,无交换律。因此在计算一长串矩阵相乘的时候,可以依据计算难度选择计算顺序,从而......
  • Miller-Rabin算法学习笔记
    个人不是很理解Miller-Rabin算法的正确性,所以这篇东西可以图一乐(确定性判素性的方法都很慢,所以要考虑随机但是错误概率低的判素方法。首先有Fermat素性测试,即费马小定理......
  • 线性表算法相关练习
    //将两个递增的有序链表合并为一个递增的有序链表。//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。#include<iostream>#......
  • python利用flux基本读写influxDB
    1、读取QuerApi形式python利用flux语句查询influxdb数据。https://influxdb-client.readthedocs.io/en/latest/api.html#queryapi代码frominfluxdb_clien......
  • 算法题基础知识汇总
     子串长度字符串python字符串的while()循环遍历​​http://www.cocoachina.com/articles/895083​​c-如何在std::vector中存储固定长度的字符串​​http://www.myexcep......