iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

前言

今天進入下一個課程-模運算
https://ithelp.ithome.com.tw/upload/images/20230917/20162613PiXlt5XzyS.png

會先稍微去爬個文,稍微了解一點模運算之後再來寫幾題,開始吧!

模運算

模運算通常表示為a mod n ,a代表被取模的數,n是模數,運算結果為a除以n的餘數,比如說 :
18 mod 4 = 2 因為18除以4的餘數為2

  • 同餘關係
    如果a, b 兩數除以同一個數n,餘數相同,就可以說a跟b在模n下的時候同餘,並用a ≡ b (mod n)表示
    舉個例子
    因為34 mod 4 = 2、 18 mod 4 = 2,代表他們有相同的餘數
    所以可以寫成34 ≡ 18 (mod 4) 解釋的話,就是「 34跟18在除以4的情況下,有相同的餘數」
  • 運算定理(來源 : https://zh.wikipedia.org/zh-tw/%E6%A8%A1%E7%AE%97%E6%95%B8)
    https://ithelp.ithome.com.tw/upload/images/20230919/20162613cmAu3fpMzr.png
  • 應用
    • 密碼加密
      • 如AES、RSA......
    • 判斷奇偶數
      • 如果數字A %(mod) 2 = 0,代表此數為偶數
    • 循環
      • 比如說有個a陣列內容為[1, 2, 3, 4, 5],然後想要輸入一個數b,代表總共要依序輸出這個陣列的值幾次,例如b = 3,代表輸出1, 2, 3,b = 6, 輸出1, 2, 3, 4, 5, 1,此時就可以用到mod,因為
        0%5 = 0
        1%5 = 1
        2%5 = 2
        3%5 = 3
        4%5 = 4
        5%5 = 0
        6%5 = 1
        7%5 = 2
        (以下省略)
        可看出取餘數可以達成循環的目的,所以我們只要用迴圈,之後裡面輸出a[i%5](i為每次+1的值,且i < b),就可以達成目的 : 依序輸出這個陣列的值
      a = [1, 2, 3, 4, 5]
      b = 6  
      for i in range(b):
          print(a[i % len(a)])
      
      • 也可以用在凱薩加密,設字串str,輸入k代表要位移的量,如果要位移字元+k後超過Z,就要回到A再繼續,達成循環,以下code為輸入限定大寫的情況下,透過%26達成循環
      str = "HELLO"
      k = 25  
      for i in range(0, len(str)):
      print(chr((ord(str[i])+k)%26+ord('A')))
      

小結

今天稍微了解了模運算,更詳細的內容可以參考其他文章,明天預計為
Modular Arithmetic的writeup

參考資料

同餘是什麼 : https://ithelp.ithome.com.tw/articles/10205727
模算數維基 : https://zh.wikipedia.org/zh-tw/%E6%A8%A1%E7%AE%97%E6%95%B8


上一篇
【Day 6】Introduction to CryptoHack 03 - XOR
下一篇
【Day 8】Modular Arithmetic 01 - gcd & egcd
系列文
資安小白的密碼學從0到1-CryptoHack平台解題紀錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言