$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> >) ; }

*