77 lines
1.6 KiB
Text
77 lines
1.6 KiB
Text
EnableExplicit
|
|
DisableDebugger
|
|
DataSection
|
|
LBL_n1:
|
|
Data.i 3,5,7
|
|
LBL_a1:
|
|
Data.i 2,3,2
|
|
LBL_n2:
|
|
Data.i 11,12,13
|
|
LBL_a2:
|
|
Data.i 10,4,12
|
|
LBL_n3:
|
|
Data.i 10,4,9
|
|
LBL_a3:
|
|
Data.i 11,22,19
|
|
EndDataSection
|
|
|
|
Procedure ErrorHdl()
|
|
Print(ErrorMessage())
|
|
Input()
|
|
EndProcedure
|
|
|
|
Macro PrintData(n,a)
|
|
Define Idx.i=0
|
|
Print("[")
|
|
While n+SizeOf(Integer)*Idx<a
|
|
Print("( ")
|
|
Print(Str(PeekI(a+SizeOf(Integer)*Idx)))
|
|
Print(" . ")
|
|
Print(Str(PeekI(n+SizeOf(Integer)*Idx)))
|
|
Print(" )")
|
|
Idx+1
|
|
Wend
|
|
Print(~"]\nx = ")
|
|
EndMacro
|
|
|
|
Procedure.i Produkt_n(n_Adr.i,a_Adr.i)
|
|
Define p.i=1
|
|
While n_Adr<a_Adr
|
|
p*PeekI(n_Adr)
|
|
n_Adr+SizeOf(Integer)
|
|
Wend
|
|
ProcedureReturn p
|
|
EndProcedure
|
|
|
|
Procedure.i Eval_x1(a.i,b.i)
|
|
Define b0.i=b, x0.i=0, x1.i=1, q.i, t.i
|
|
If b=1 : ProcedureReturn x1 : EndIf
|
|
While a>1
|
|
q=Int(a/b)
|
|
t=b : b=a%b : a=t
|
|
t=x0 : x0=x1-q*x0 : x1=t
|
|
Wend
|
|
If x1<0 : ProcedureReturn x1+b0 : EndIf
|
|
ProcedureReturn x1
|
|
EndProcedure
|
|
|
|
Procedure.i ChineseRem(n_Adr.i,a_Adr.i)
|
|
Define prod.i=Produkt_n(n_Adr,a_Adr), a.i, b.i, p.i, Idx.i=0, sum.i
|
|
While n_Adr+SizeOf(Integer)*Idx<a_Adr
|
|
b=PeekI(n_Adr+SizeOf(Integer)*Idx)
|
|
p=Int(prod/b) : a=p
|
|
sum+PeekI(a_Adr+SizeOf(Integer)*Idx)*Eval_x1(a,b)*p
|
|
Idx+1
|
|
Wend
|
|
ProcedureReturn sum%prod
|
|
EndProcedure
|
|
|
|
OnErrorCall(@ErrorHdl())
|
|
OpenConsole("Chinese remainder theorem")
|
|
PrintData(?LBL_n1,?LBL_a1)
|
|
PrintN(Str(ChineseRem(?LBL_n1,?LBL_a1)))
|
|
PrintData(?LBL_n2,?LBL_a2)
|
|
PrintN(Str(ChineseRem(?LBL_n2,?LBL_a2)))
|
|
PrintData(?LBL_n3,?LBL_a3)
|
|
PrintN(Str(ChineseRem(?LBL_n3,?LBL_a3)))
|
|
Input()
|