context: //
  // MonoTests.Mono.Math.ModInverseBigTest.cs
  //
  // Authors:
  //	Ben Maurer
  //
  // Copyright (c) 2003 Ben Maurer. All rights reserved
  //
  
  using System;
  using Mono.Math;
  using NUnit.Framework;
  
  namespace MonoTests.Mono.Math {
  
  	public abstract class ModInverseBig_Base : BigIntegerTestSet {
  
  		BigInteger A, B, AmodinvB;
  
  		public ModInverseBig_Base () 
  		{
  			A = new BigInteger (a);
  			B = new BigInteger (b);
  			AmodinvB = new BigInteger (ExpectedAmodinvB);
  		}
  		
  		public abstract uint[] a {
  			get;
  		}
  		public abstract uint[] b {
  			get;
  		}
  
  		public abstract uint[] ExpectedAmodinvB {
  			get;
  		}
  
  		[Test]
  		public void ModInvPP () 
  		{
  			Expect (A.ModInverse (B), AmodinvB);
  		}
  	}
  	
  	public class ModInverseBig_Rand512a1024b : ModInverseBig_Base {
  
  	
  		public override uint[] a {
  			get {
  				return new uint[] {
  					0x48fd8f2e, 0xa791b900, 0x19e53aaa, 0x6d45758a, 0xeb8be610, 0x25c42285,
  					0xabff3066, 0xcdcb9969, 0xa08fd7c1, 0x1c382419, 0xcd6b685b, 0x23e8bcaf,
  					0x592a0f82, 0x2b54b60b, 0xbb67f3c2, 0x64313461
  				};
  			}
  		}
  
  		public override uint[] b {
  			get {
  				return new uint[] {
  					0x3617f5e4, 0xd32a40dc, 0x358f7c09, 0x976b345b, 0x4dc05c63, 0x91ed990d,
  					0xfc66b0a6, 0x0a36dd7e, 0x7a5ea721, 0xf28b577e, 0xf014cbf6, 0x597b4094,
  					0x177f8253, 0x6587a352, 0x67fedcf0, 0x61ee389e, 0xff86cc7d, 0x9817cd3a,
  					0x632d6730, 0x3082112a, 0x48509e74, 0x198c7802, 0x69d8c4c6, 0x727313e9,
  					0x1e11ae51, 0xa72a33bb, 0xc9059cc7, 0xc9fc6268, 0x34ed466b, 0x11e49879,
  					0x8eb7ebf5, 0x98b53108
  				};
  			}
  		}
  
  		public override uint[] ExpectedAmodinvB {
  			get {
  				return new uint[] {
  					0x045fbad9, 0x61867c14, 0xb30ff1f7, 0x5deaf4c1, 0xd19e0b62, 0xc4ed73af,
  					0x9501dbd4, 0x0b052e1c, 0xd3e944c3, 0xeddc333b, 0x1444c1f9, 0x38ca61b7,
  					0xceec8a0d, 0xec8f2814, 0xa2099df4, 0x2a0ddbd0, 0x9193985d, 0x09f89197,
  					0xb58e7229, 0x45c1f891, 0x93553056, 0x462dbe6a, 0xb70c95d0, 0x7cf80ae9,
  					0x7833e1bf, 0x88329c50, 0xdbde3ef8, 0x7a426200, 0x4335234a, 0x2556ba2c,
  					0x94cc2109, 0x046645c1
  				};
  			}
  		}
  	}
  
  	public class ModInverseBig_Rand256a1024b : ModInverseBig_Base {
  
  	
  		public override uint[] a {
  			get {
  				return new uint[] {
  					0xcc2e79fa, 0x6901026e, 0xc4fdb0d4, 0xb4173ce7, 0xf7f96af1, 0x8339780b,
  					0x22268620, 0x382c75a4
  				};
  			}
  		}
  
  		public override uint[] b {
  			get {
  				return new uint[] {
  					0x4b23ac44, 0xbddfc733, 0x3ea2a85b, 0x02daa1d8, 0x2b31cf00, 0x2503a376,
  					0xa3d47c77, 0x829266d7, 0x1e29fad8, 0x4f0e3788, 0xc9c128d7, 0x13ea53eb,
  					0x85fc86b1, 0xbad2c0c4, 0xd87dcdad, 0x0a09ba8c, 0x126a0ede, 0x1fe390c7,
  					0x12c5a679, 0xf23557e1, 0x8e7b1934, 0xc102f83b, 0x934de6d6, 0x254aee03,
  					0x34f02315, 0x33edbb07, 0x97a87ecf, 0xbf534337, 0xe347ae90, 0xf2eb1176,
  					0x5459c63b, 0x8f3b0f75
  				};
  			}
  		}
  
  		public override uint[] ExpectedAmodinvB {
  			get {
  				return new uint[] {
  					0x12d80123, 0x9b288afc, 0x466ed241, 0x8bf1804d, 0x73cd667f, 0x8eb1eb34,
  					0x513df007, 0x464c7245, 0xf3b97899, 0xd5cb92c7, 0xdefdb611, 0x5258e545,
  					0xe8b66c76, 0xd11c58e3, 0xab1fc29a, 0x9718099e, 0xa4040d4e, 0x29980874,
  					0xda2b4e0d, 0xfed020de, 0x6bde01e6, 0x15b084af, 0x9657aa64, 0x760c64f0,
  					0x6bba8099, 0xef1a409e, 0xf80b1ec7, 0x4a69256b, 0xf867ec36, 0xd3659a2a,
  					0xf23ec3a5, 0x04349da9
  				};
  			}
  		}
  	}
  	
  	public class ModInverseBig_Rand256a512b : ModInverseBig_Base {
  
  		public override uint[] a {
  			get {
  				return new uint[] {
  					0x2e9342c8, 0x1ac6b23d, 0xeb18d3f9, 0x2b076025, 0x030232ee, 0xd1cb7f22,
  					0xfbfe74df, 0xabadc589
  				};
  			}
  		}
  
  		public override uint[] b {
  			get {
  				return new uint[] {
  					0x7e0a43ca, 0xf05d9c52, 0x28e68cf6, 0xf168b591, 0x88c17e79, 0xcb075c3b,
  					0x92a16680, 0xd7dccd53, 0xe6da1248, 0xe71811b7, 0x4d0a3c42, 0x1ebb46cc,
  					0x71d4dd69, 0x07a642d9, 0x8eae29d0, 0xcbd278b4
  				};
  			}
  		}
  
  		public override uint[] ExpectedAmodinvB {
  			get {
  				return new uint[] {
  					0x77dc2534, 0xf81a1bc7, 0xfbd6b350, 0x809b2c31, 0x3e04ad9f, 0x5101b59f,
  					0xcee28213, 0x726356fe, 0xeb7d0a6b, 0x01ed7bd7, 0x27ff2f04, 0xa3cbd6a4,
  					0xcd6a849d, 0x029c9a79, 0xb82d5da2, 0x87af9e81
  				};
  			}
  		}
  	}
  
  	public class ModInverseBig_Rand1024a5b : ModInverseBig_Base {
  
  		public override uint[] a {
  			get {
  				return new uint[] {
  					0x60cc0502, 0xebe19e1b, 0xfc64fd47, 0xfc34fbac, 0x81b3b346, 0x57e9ebf8,
  					0x96501b67, 0xc95eb1cc, 0x2e126045, 0xa56ec13b, 0x2f812165, 0xb4391e46,
  					0xb245069a, 0xfeb836b6, 0xebeceb62, 0xedd9f9bc, 0x9bdd63ba, 0xac491f92,
  					0xb8ab6898, 0x8a5ea88d, 0xf7f24993, 0x75e86618, 0x4e939376, 0x7a2ac365,
  					0xb270f14c, 0x416fb9bc, 0x77af8352, 0x488e1a5f, 0xe22e8cda, 0xcaa72806,
  					0xf649f663, 0xefee082d
  				};
  			}
  		}
  
  		public override uint[] b {
  			get {
  				return new uint[] {
  					0x11
  				};
  			}
  		}
  
  		public override uint[] ExpectedAmodinvB {
  			get {
  				return new uint[] {
  					0x2
  				};
  			}
  		}
  	}
  
  	public class ModInverseBig_Rand3a1024b : ModInverseBig_Base {
  
  		public override uint[] a {
  			get {
  				return new uint[] {
  					0x5
  				};
  			}
  		}
  
  		public override uint[] b {
  			get {
  				return new uint[] {
  					0x3919ec8a, 0x8c713779, 0xb87d2db0, 0x7922df91, 0x34bf77e1, 0x49c08156,
  					0x9ffb8ed5, 0x522a42e9, 0xdf18b1ff, 0x1cfdc432, 0x8564555b, 0x2b800684,
  					0xa46bad82, 0x175a04ea, 0x87e4d513, 0xfb956ebc, 0xb74745e6, 0x85f45bf5,
  					0xe580bb11, 0x290bfc35, 0x8d8782d8, 0x1054ea4e, 0x93eb86bb, 0xe7ea2e42,
  					0x762c2945, 0x23e59e46, 0x833fe0b2, 0x3797025f, 0xabc64408, 0x94d0c8ac,
  					0x2a31e00b, 0xd4d28ab0
  				};
  			}
  		}
  
  		public override uint[] ExpectedAmodinvB {
  			get {
  
gt: 				return new uint[] {