1. -- 
  2. -- Uwe R. Zimmer, Australia, 2014 
  3. -- 
  4.  
  5. generic 
  6.  
  7.    Modulo : Positive; 
  8.  
  9. package Modulo_Type_Generic is 
  10.  
  11.    subtype Mod_Type is Natural range 0 .. Modulo - 1; 
  12.  
  13.    function Add_Mod (Left, Right : Mod_Type)           return Mod_Type is ((Left +  Right) mod Modulo); 
  14.    function Sub_Mod (Left, Right : Mod_Type)           return Mod_Type is ((Left -  Right) mod Modulo); 
  15.    function Mul_Mod (Left, Right : Mod_Type)           return Mod_Type is ((Left *  Right) mod Modulo); 
  16.    function Div_Mod (Left, Right : Mod_Type)           return Mod_Type is ((Left /  Right) mod Modulo); 
  17.    function Pow_Mod (Left : Mod_Type; Right : Natural) return Mod_Type is ((Left ** Right) mod Modulo); 
  18.  
  19.    function "+"  (Left, Right : Mod_Type)           return Mod_Type renames Add_Mod; 
  20.    function "-"  (Left, Right : Mod_Type)           return Mod_Type renames Sub_Mod; 
  21.    function "*"  (Left, Right : Mod_Type)           return Mod_Type renames Mul_Mod; 
  22.    function "/"  (Left, Right : Mod_Type)           return Mod_Type renames Div_Mod; 
  23.    function "**" (Left : Mod_Type; Right : Natural) return Mod_Type renames Pow_Mod; 
  24.  
  25. end Modulo_Type_Generic;