18-04-18 回顾 可汗学院:计算数论

关键字

  • 计算数论: 时间复杂度 空间复杂度 质数 合数 sieve of eratosthenes ,质数定理 条件概率 贝叶斯理论

睡梦——>昨晚:

昨晚由于某些原因失控了,做了一些此刻我认为不该做的事情。但,有一点我没做了:玩王者荣耀。以前的时候,遇到这种导致"失眠"的情况,我会选择王者荣耀来让自己冷却。这一点,值得我深化:不要再以任何借口去玩王者荣耀,它对我来说就是毒品。

昨日回顾:

LEARN:

刻意训练难点, 组块化图书馆构建复杂知识体系,神经递质决定了我们做事情的态度,交替学习让不同知识组块间交叉得以有创新的基础。

SYNTAX Python3 :

输出,语法:标识符,数据结构,操作符,变量
控制流:if while.for , 函数:5种参数
模块

今日回顾:

计算数论:

时间复杂度 空间复杂度

考虑时间(运行布数)和空间(存储)随着数据的增大或者增多所带来的变化。
时间复杂度大致有以下:
O(n) = 1, lnx, x xlnx , x^2, x^3....

质数 合数

质数(prime):

任何大于1的整数,如果只能被1和它自身整除,则为质数(素数),换句话说,除了1和它自身,质数无其他因数。

简单质数如下:2 3 5 7 11.....质数有无限个。

除2以外,质数都是奇数。——> 除2以外,偶数都不是质数。

除2和3以外,其他所有的质数都满足 6k+1,6k-1 (或者6k+5),且k>1,k为整数。

合数(composite)

对于大于一的正整数,不是质数就是合数。
合数至少有四个因数。

任何合数都能被分解为多个质数相乘。
合数=质数x质数x质数

质数判定

对于一个给定的正整数N,如何判定其为质数(合数)?

  • 2到Root(N)区间,不存在任何一个整数能整除N,则N为质数(更容易理解:在这个区间,只要存在一个整数能整除N,则N为合数)
    伪代码(以下Root(N) 表示N的平方根):
Def  is_Prime(N):
   flag = 0 
   For num from  2  to   Root(N):
         IF    num能整除N
                flag = 1
                break
   IF   flag =  0
        print   N为质数
   Else
        print   N为合数

总结一下存在任何一个 就成立 与 不存在任何一个才成立的代码思路:

flag = 0
for 循环
      if   conditionTrue
             flag = 1
             break
if     flag = 0
     print   不存在任何一个元素符合循环条件
else 
     print    只要有一个元素符合循环条件

考虑到时间复杂度,优化:

  • 3到Root(N)区间,没有任何一个奇数能整除N,则N为质数:
Def     is_Prime(N):
    flag=0 
    For num   from  2  to   Root(N),   step=2  :
            IF    num能整除N
                    flag=1
                    break
    IF   flag=0
            printN为质数
    Else
            print   N为合数

具体实现请点击

sieveoferatosthenes:

埃拉托斯特尼筛 :

一个简单的筛选100以内素数的方法:

  • 画一个10*10表格,去掉1
  • 去除2的倍数
    所有的偶数都不是质数/素数,所以去掉2的倍数(另一个角度是2的倍数2N 可由除1与2N外的其他质数相乘而得)
  • 去除3的倍数,同2
  • 去除5的倍数,7的倍数
  • 剩余的数便是所有100以内的质数
    -(补充:判断一个数是不是质数,100为例
    ) 判断整除范围,100^(1/2)=10,from2to10(此处可以考虑两个集合,①10作为分界点:10*10 ,若10左边的某个数能整除100,则商一定在10的右边。换句话说,判断是否为质数转化为判断100是不是合数,而合数很容易判断,只要100能被除了1与100的某一个数整除,就可以判定他是合数。根据①可知我只需要考虑2到10之间的数就可以。
    更进一步,只需要考虑2到10之间的质数能否整除。)

其实以上去除倍数 可归结为去除10( 为100的平方根 )以内所有质数的倍数

灵感:快速查找N^2 范围内的所有质数

  • 先做一个N*N的表格,去掉1
  • 用类似的方法找到N以内的所有质数(根号N
  • 根号N的表格 )
  • 去除N以内所有质数的倍数,剩下的便是质数
  • 应用:10以内的质数很容易记住:2 3 5 7
    100以内的根据1010表格
    10000以内的根据100
    100表格

伪代码:

# 根据埃拉托斯特尼筛,筛选整数 n*n 以内的所有质数
List = range(n*n)
For num  from  2  to  n:
    标记n*n以内所有num的倍数(2倍及2倍以上)为marked
unmarked便是所有的质数
          

质数密度曲线(需要再认真看一边视频)

质数数量(纵轴)——筛选空间N(横轴)曲线:
当N越来越大,趋向于无穷大时,其曲线无限接近y=ln(x)的曲线
质数密度= 质数数量/筛选空间
1/ln(x)

质数定理
当N无穷大时,

条件概率

P(A|B)= P(AB)/P(B)
推导
P(AB)=P(A|B)/P(B)
P(BA)=P(B|A)/P(A)
因为
P(AB)=P(BA)=P(A∩B)
所以
P(A|B)/P(B)=P(B|A)/PA
所以P(A|B) / P(B|A) = P(A) /P(B)

P(A|B)条件概率:在 B发生的情况下,A发生的概率
P(AB) 联合概率,A与B同时发生的概率

贝叶斯理论

你可能感兴趣的:(18-04-18 回顾 可汗学院:计算数论)