zoukankan      html  css  js  c++  java
  • 取模运算

    模运算基本概念

      对于一个钟表来说,我们知道他从0点开始到12点结束(可以这么理解),很容易知道

      5点+3点 = 8点

      那么,9点+ 200点 的时候,时针再哪呢? 答 :

        209 -12 = 197 

        197 - 12 = 185

        ....

        17 -12 = 5

        这种“回调”叫做取模运算(modular arithmetic)    我们说 17 模 12 等于 5

        Python中模运算符是 % 

        某种程度上,我们可以说:“模” 是 “余数”

        还需要记住,计算机中模运算的结果都是正数, 有方便的计算手段 :

          209 % 12 = 5     即数学上  209 mod 12 = 5 

    >>> 209 mod 12
      File "<stdin>", line 1   
        209 mod 12
            ^
    SyntaxError: invalid syntax
    >>> 209 % 12   
    5   
    >>> -21 % 12
    3
    >>> -21 % 5 
    4
    >>>

     P.S. 多重赋值

    >>> a, b = 45, 687
    >>> a, b
    (45, 687)
    >>> a
    45
    >>> c, v, n, m = ['sad', 456, 'a', a]
    >>> v
    456
    >>> v
    456
    >>> n
    'a'
    >>> c
    'sad'
    >>> m
    45
    >>> q, w, e = [555, 888] 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: not enough values to unpack (expected 3, got 2)
    >>> q, w, e = [555, 888, 999, 'dasdsd'] 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: too many values to unpack (expected 3)
    >>>

    要求 : 赋值运算符''="左右两边的项要相等

      可以使用多重赋值来方便地交换值

    >>> a, b = 45, 79
    >>> a, b = b, a
    >>> a, b
    (79, 45)
    >>>

    欧几里得算法---找两个正整数的GCD

      GCD(最大公约数 or 最大公因数)

      因子:若b整除a,则说b是a的一个因子,用b|a 表示

        • 若 a|1, 则a = ±1    
        • 若 a|b 且 b|c 则 a|c
        • 若 a|b 且 b|a, 则 a = ± b
        • 任何不等于0的数整除0
        • 对于任意整数m, n,若有b|g, 且 b|h,则有b | (mg + nh)
        • 若有b|g,则存在g1, 使得g可以表示为 g = b × g1

    Euclid algorithm:

      (1)假设我们要求出整数a 和 b 的最大公因子d,因为gcd(|a|, |b|) = gcd(a, b), 我们大胆假定 a ≥ b > 0

      (2)使用带余除法,b除a表示为:      a = q1b + r1  ;              0 ≤ r1 < b

      (3)首先靠遇到 r1 = 0 时,即 b整数了a , 余数为0, 模运算 a mod b = 0, a 和 b 的公因子不可能有

        比b更大的数了,所以这时候, 最大公约数 d = gcd(a, b) = b

      (4)另一种情况是, r1 ≠ 0, 这时,由于存在 d|a, d|b, 那么一定有d | (a -  q1b) 即: d|r1, d是r1的因子!

      (5)考察gcd(b, r1) = ? 我们知道了

        d|b ,  d|r1, 对于b 和 r1的任何一个公因子c来说,有c|(q1b + r1) 即 c|a, c|b, 

        我们说 c ≤ d, 因为 d 已经被定义为最大的的那个公因子,

        所以 d = gcd(b, r1)

    特别的,如果说gcd(a,b) = 1 ,那么就说a 和 b互质

    Euclid 算法python实现:

    >>> def mygcd(a, b):    
    ...     while a != 0:
    ...             a, b = b % a, a 
    ...     return b
    
    
    >>>
    >>> mygcd(9, 3)     
    3
    >>> mygcd(409119243, 87780243) 
    6837
    >>>
  • 相关阅读:
    使用 webapi+Aspose.Cells 导出execl 功能
    自定义html滚动条样式
    vue+webapi 实现WebSocket 推送
    vue 跨层级 调用solt 传递
    关于对 asp.net mvc 异步方法的理解
    c# 反射机制
    千里之行,始于足下
    [转]浅析大数据量高并发的数据库优化
    关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”
    深拷贝
  • 原文地址:https://www.cnblogs.com/PiaYie/p/13474879.html
Copyright © 2011-2022 走看看