正整數冪餘數(II)
程式新版
新版共有二個程式,程式可以計算一個整數的正整數冪的餘數 (Xa mod b,其中X,a及b為正整數),程式較第一版能計算 更多的情況(包括負數的被除數底及負數的除數,第一個程式需要在BASE模式下執行,程式較簡潔。第二個程式則在 COMP 模式下執行,程式較長,計算的情況略為比第一個程式情況多,不過要特留意輸入的限制條件,違反限制,第二個程式有可能會出現錯誤的數值答案(第一個程式無法得出正確答案則會出現Math ERROR),亦即是第二個程式沒有防錯誤功能。
程式編寫日期: 2006年6月7日 (修改日期: 2006年8月4日)
程式需要在 BASE 模式下執行,因此在輸入程式前請先按 Mode Mode 3 進入BASE模式。
第一個程式 (72 bytes,使用記憶為A、B、C及M)
Dec: 1→C: ?→M: ?→A: ?→B: Lbl 0: M ÷ B × BM-:
A - A ÷ 2 × 2 => CM - CM ÷ B × B→C:
A ÷ 2→A => MM→M: A => Goto 0: C + B(0>CB
第二個程式 (COMP模式,93bytes,使用記憶為A、B、C及M)
1→C: ?→A: ?→M: ?→B: Fix 0: Lbl 0:
A ÷ B - . 5: Rnd: A - BAns→A: M ÷ 2→M: Rnd:
M=Ans => Goto 1: AC => AC ÷ B - . 5 => Rnd:
AC - BAns→C: . 5M-: Lbl 1: A2→A: M => Goto 0: Norm 1: C
註1: 若果計算Xa mod b,第一個程式的限制條件為 -2147483647≦X ≦ 2147483647,0≦a ≦ 2147483647 及 - 46341<b ≦46341,若果 b > 46341或b<- 46541時,亦可以嘗試輸入計算,因為有可能可以計算出答案,若果無法計算得到答案會顯示Math ERROR。第二個程式的限制條件為 -99999 99999≦X≦99999 99999,0≦a≦99999 99999,-316227≦b≦316227,若果b>999 999或b<-999 999時,出現錯誤答案的機會率會隨b值的增大明顯增加。
註2: 第一個程式當計算冪為1或0時,b值的限制變為 -2147483647≦b ≦ 2147483647
例題1: 計算 310 mod 9的值 (即 310 ÷ 9的餘數)
按 Prog 1 3 EXE 10 EXE 9 EXE (顯示餘數為0)
若果是第一個程式,計算完結後按 MODE 1 返回正常計算模式。
例題2: 計算 600013 mod 45001的值 (即 600013 ÷ 45001的餘數)
按 Prog 1 60001 EXE 3 EXE 45001 EXE (顯示餘數為16667)
若果是第一個程式,計算完結後按 MODE 1 返回正常計算模式。
例題3: 計算 (-231)300 mod 45的值 (即 (-231)300 ÷ 45的餘數)
注意: 第一個程式使用BASE模式,所以無法使用負號,輸入負數時要用減號代替負號
按 Prog 1 - 231 EXE 300 EXE 45 EXE (顯示餘數為36)
若果是第一個程式,計算完結後按 MODE 1 返回正常計算模式。
程式設計小貼士:
計算機程式若只取整數部份(小數位捨去不要),直接的方法可以使用基數模式,或使用計算機中四捨五入的功能。
使用的指令為Fix 0及Rnd,例如: Fix 0: A - . 5: Rnd:
但要注意A為負數及0時,這方法是不成立,這亦是最多初寫程式的朋友最易錯的地方,所以上述程式用了一個特別方法處理這個問題,否則計算310 mod 9時就會出現錯誤答案,試試找找這個方法。
程式舊版
這個程式可以一個正整數的正整數冪的餘數 (Xa mod b,其中X,a及b為正整數),程式較第一版能計算更大數值的除數及被除數,例如: 600013 mod 45001 第一版的程式就無法計算得到答案。
程式編寫日期: 2006年6月7日
程式需要在 BASE 模式下執行,因此在輸入程式前請先按 Mode Mode 3 進入BASE模式。
第一個程式 (70 bytes,使用記憶為A、B、C及M)
Dec: 1→C: ?→M: ?→A: ?→B: M ÷ B × BM-:
Lbl 0: A - A ÷ 2 × 2 => CM - CM ÷ B × B→C:
MM - MM ÷ B × B→M: A ÷ 2→A => Goto 0: C
註1: 程式沒有防錯誤功能,因此未執行程式前,若記憶A、B及C儲存的數值大於基數模式的接受範圍,執行程式及輸入數值時會出現Math ERROR,這時只要再按 SHIFT MODE 1清除記憶,再執行程式即可,若果不想這樣做,可在程式最前加入編碼 "Mem clear:",程式長度則多 2 bytes。
註2: 若果計算Xa mod b,程式的限制條件為 X ≦ 2147483647,a ≦ 2147483647 及 b ≦46341,若果 b > 46341時,亦可以嘗試輸入計算,因為有可能可以計算出答案。
例題: 計算 600013 mod 45001的值 (即 600013 ÷ 45001的餘數)
按 Prog 1 60001 EXE 3 EXE 45001 EXE (顯示餘數為16667)
計算完結後按 MODE 1 返回正常計算模式。
註4: 程式一計算簡單餘數問題 (冪為1時,即計算 X mod b),限制條件不變,因此不少簡單餘數問題不能計算得到,例如: 99988 mod 50000, 為了能同時應用程式計算更大數值的簡單餘數問題,可以使用以下的改良版本,而程式長度會增加 2 bytes。
第二個程式 (72 bytes,使用記憶為A、B、C及M)
Dec: 1→C: ?→M: ?→A: ?→B: M ÷ B × BM-:
Lbl 0: A - A ÷ 2 × 2 => CM - CM ÷ B × B→C:
A ÷ 2→A => MM - MM ÷ B × B→M: A => Goto 0: C