$ENTRY Go { =
<BR 'P=' 7>
<Prout <Zp_Add ( 5 ) 4 > ' = ' 2 >
<Prout <Zp_Mul ( 5 ) 4 > ' = ' 6 >
<Prout <Zp_Inv 5 > ' = ' 3 > ;
}
$EXTERN ADD , SUB , MUL , DIVMOD;
$EXTERN CP, BR;
$ENTRY Zp_Add { (e.A) e.B = <MOD <ADD (e.A) e.B>>; }
MOD { e.1 = <MOD1 <DIVMOD (e.1) <CP 'P'> >>; }
MOD1 { (e.Q) e.R = e.R; }
$ENTRY Zp_Sub { (e.A) e.B = <MOD <SUB (<ADD (e.A) <CP'P'>>) e.B> >; }
$ENTRY Zp_Mul { (e.A) e.B = <MOD <MUL (e.A) e.B>>; }
$ENTRY Zp_Div { (e.A) e.B = <Zp_Mul (e.A) <Zp_Inv e.B> >; }
$ENTRY Zp_Inv { e.M = <Zp_Inv1 (<CP 'P'>) ( 0 ) (e.M) ( 1 ) >; }
Zp_Inv1 {
(e.A) (e.X) ( 1 ) (e.Y) = e.Y;
(e.A) (e.X) (e.B) (e.Y) = <Zp_Inv1 (eB) (eY)
<Zp_Inv2 (e.X) (e.Y) <DIVMOD (e.A) e.B> > >;
}
Zp_Inv2 { (e.X) (e.Y) (e.Q) e.R = (e.R)
(<Zp_Sub (e.X) <Zp_Mul (e.Y) e.Q> >) ; }
*