mirror of
https://github.com/MachineCognitis/Math.Gmp.Native.git
synced 2024-09-07 09:48:21 +02:00
9072 lines
336 KiB
C#
9072 lines
336 KiB
C#
|
|
using System;
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
using System.Runtime.InteropServices;
|
|
using Math.Gmp.Native;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace UnitTests
|
|
{
|
|
[TestClass]
|
|
public class UnitTest
|
|
{
|
|
|
|
#region "Utility functions."
|
|
|
|
private delegate TResult _Func<out TResult>();
|
|
|
|
private string Test(_Func<object> func)
|
|
{
|
|
object result = null;
|
|
try
|
|
{
|
|
result = func();
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
return ex.GetType().Name;
|
|
}
|
|
return result.ToString();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Types."
|
|
|
|
[TestMethod]
|
|
public void char_ptr_test()
|
|
{
|
|
// Create new string in unmanaged memory.
|
|
char_ptr s = new char_ptr("Test");
|
|
Assert.IsTrue(s.ToString() == "Test");
|
|
|
|
// Set string pointer to zero.
|
|
s = char_ptr.Zero;
|
|
Assert.IsTrue(s.ToIntPtr() == IntPtr.Zero);
|
|
|
|
// Assert that obj and s are the same pointer.
|
|
object obj = s;
|
|
Assert.IsTrue(s.Equals(obj) == true);
|
|
|
|
// Create new unmanaged string.
|
|
char_ptr t = new char_ptr("Test");
|
|
|
|
// Assert that s and t are distinct string pointers.
|
|
Assert.IsTrue(s.Equals(t) == false);
|
|
|
|
// Check inequality and equality of s and t pointers.
|
|
Assert.IsTrue(s != t);
|
|
gmp_lib.free(t);
|
|
t = s;
|
|
Assert.IsTrue(s == t);
|
|
gmp_lib.free(t);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randstate_t_test()
|
|
{
|
|
// Allocate and release random number generator state.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.free(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_bitcnt_t_test()
|
|
{
|
|
mp_bitcnt_t v;
|
|
|
|
byte zero = 0;
|
|
sbyte minusOne = -1;
|
|
|
|
// Check implicit and explict conversions to mp_bitcnt_t.
|
|
v = (byte)zero;
|
|
v = (mp_bitcnt_t)(sbyte)zero;
|
|
v = (ushort)zero;
|
|
v = (mp_bitcnt_t)(short)zero;
|
|
v = (uint)zero;
|
|
v = (mp_bitcnt_t)(int)zero;
|
|
v = (mp_bitcnt_t)(ulong)zero;
|
|
v = (mp_bitcnt_t)(long)zero;
|
|
|
|
// Check implicit and explict conversions from mp_bitcnt_t.
|
|
byte b = (byte)v;
|
|
sbyte sb = (sbyte)v;
|
|
ushort us = (ushort)v;
|
|
short s = (short)v;
|
|
uint ui = v;
|
|
int i = (int)v;
|
|
ulong ul = v;
|
|
long l = v;
|
|
|
|
// Check OverflowException cases.
|
|
Assert.IsTrue(Test(() => v = (mp_bitcnt_t)(sbyte)minusOne) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_bitcnt_t)(short)minusOne) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => v = (mp_bitcnt_t)(int)minusOne) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_bitcnt_t)(long)minusOne) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => v = (mp_bitcnt_t)ulong.MaxValue) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_bitcnt_t)long.MaxValue) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => b = (byte)(new mp_bitcnt_t(uint.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_bitcnt_t(uint.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => us = (ushort)(new mp_bitcnt_t(uint.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_bitcnt_t(uint.MaxValue))) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => i = (int)(new mp_bitcnt_t(uint.MaxValue))) == typeof(OverflowException).Name);
|
|
|
|
// Check equality and inequality.
|
|
Object obj = new mp_bitcnt_t(8);
|
|
Assert.IsTrue((new mp_bitcnt_t(8)).Equals(obj));
|
|
Assert.IsTrue(!(new mp_bitcnt_t(8)).Equals(new int()));
|
|
Assert.IsTrue((new mp_bitcnt_t(8)).Equals(new mp_bitcnt_t(8)));
|
|
Assert.IsTrue(!(new mp_bitcnt_t(8)).Equals(new mp_bitcnt_t(9)));
|
|
Assert.IsTrue((new mp_bitcnt_t(8)) == (new mp_bitcnt_t(8)));
|
|
Assert.IsTrue((new mp_bitcnt_t(8)) != (new mp_bitcnt_t(9)));
|
|
}
|
|
|
|
//[TestMethod]
|
|
//public void mp_exp_ptr_test()
|
|
//{
|
|
// // Create new exponent pointer.
|
|
// mp_exp_ptr i = new mp_exp_ptr(8);
|
|
|
|
// // Assert that obj and i are the same pointer.
|
|
// object obj = i;
|
|
// Assert.IsTrue(i.Equals(obj) == true);
|
|
|
|
// // Create new exponent pointer.
|
|
// mp_exp_ptr j = new mp_exp_ptr(8);
|
|
|
|
// // Assert that i and j are distinct exponent pointers.
|
|
// Assert.IsTrue(i.Equals(j) == false);
|
|
|
|
// // Check equality of i and j values.
|
|
// Assert.IsTrue(i.Value == j.Value);
|
|
// i.Value += 4;
|
|
// Assert.IsTrue(i.Value != j.Value);
|
|
|
|
// // Check inequality and equality of i and j pointers.
|
|
// Assert.IsTrue(i != j);
|
|
// gmp_lib.free(j);
|
|
// j = i;
|
|
// Assert.IsTrue(i == j);
|
|
|
|
// // Check equality of i and j values.
|
|
// Assert.IsTrue(i.Value == j.Value);
|
|
// i.Value += 4;
|
|
// Assert.IsTrue(i.Value == j.Value);
|
|
|
|
// gmp_lib.free(j);
|
|
//}
|
|
|
|
[TestMethod]
|
|
public void mp_exp_t_test()
|
|
{
|
|
mp_exp_t v;
|
|
|
|
byte zero = 0;
|
|
|
|
// Check implicit and explict conversions to mp_exp_t.
|
|
v = (byte)zero;
|
|
v = (sbyte)zero;
|
|
v = (ushort)zero;
|
|
v = (short)zero;
|
|
v = (mp_exp_t)(uint)zero;
|
|
v = (int)zero;
|
|
v = (mp_exp_t)(ulong)zero;
|
|
v = (mp_exp_t)(long)zero;
|
|
|
|
// Check implicit and explict conversions from mp_exp_t.
|
|
byte b = (byte)v;
|
|
sbyte sb = (sbyte)v;
|
|
ushort us = (ushort)v;
|
|
short s = (short)v;
|
|
uint ui = (uint)v;
|
|
int i = v;
|
|
ulong ul = (ulong)v;
|
|
long l = v;
|
|
|
|
// Check OverflowException cases.
|
|
Assert.IsTrue(Test(() => v = (mp_exp_t)uint.MaxValue) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_exp_t)long.MaxValue) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_exp_t)ulong.MaxValue) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => b = (byte)(new mp_exp_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_exp_t(int.MinValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_exp_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => us = (ushort)(new mp_exp_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_exp_t(int.MinValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_exp_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
|
|
// Check equality and inequality.
|
|
Object obj = new mp_exp_t(8);
|
|
Assert.IsTrue((new mp_exp_t(8)).Equals(obj));
|
|
Assert.IsTrue(!(new mp_exp_t(8)).Equals(new byte()));
|
|
Assert.IsTrue((new mp_exp_t(8)).Equals(new mp_exp_t(8)));
|
|
Assert.IsTrue(!(new mp_exp_t(8)).Equals(new mp_exp_t(9)));
|
|
Assert.IsTrue((new mp_exp_t(8)) == (new mp_exp_t(8)));
|
|
Assert.IsTrue((new mp_exp_t(8)) != (new mp_exp_t(9)));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_limb_t_test()
|
|
{
|
|
mp_limb_t v;
|
|
|
|
byte zero = 0;
|
|
sbyte minusOne = -1;
|
|
|
|
// Check implicit and explict conversions to mp_limb_t.
|
|
v = (byte)zero;
|
|
v = (mp_limb_t)(sbyte)zero;
|
|
v = (ushort)zero;
|
|
v = (mp_limb_t)(short)zero;
|
|
v = (uint)zero;
|
|
v = (mp_limb_t)(int)zero;
|
|
v = (ulong)zero;
|
|
v = (mp_limb_t)(long)zero;
|
|
|
|
// Check implicit and explict conversions from mp_limb_t.
|
|
byte b = (byte)v;
|
|
sbyte sb = (sbyte)v;
|
|
ushort us = (ushort)v;
|
|
short s = (short)v;
|
|
uint ui = (uint)v;
|
|
int i = (int)v;
|
|
ulong ul = v;
|
|
long l = (long)v;
|
|
|
|
// Check OverflowException cases.
|
|
Assert.IsTrue(Test(() => v = (mp_limb_t)(sbyte)minusOne) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_limb_t)(short)minusOne) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => v = (mp_limb_t)(int)minusOne) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => v = (mp_limb_t)(long)minusOne) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => b = (byte)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => us = (ushort)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => i = (int)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => ui = (uint)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => l = (long)(new mp_limb_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
|
|
// Check equality and inequality.
|
|
Object obj = new mp_limb_t(8);
|
|
Assert.IsTrue((new mp_limb_t(8)).Equals(obj));
|
|
Assert.IsTrue(!(new mp_limb_t(8)).Equals(new byte()));
|
|
Assert.IsTrue((new mp_limb_t(8)).Equals(new mp_limb_t(8)));
|
|
Assert.IsTrue(!(new mp_limb_t(8)).Equals(new mp_limb_t(9)));
|
|
Assert.IsTrue((new mp_limb_t(8)) == (new mp_limb_t(8)));
|
|
Assert.IsTrue((new mp_limb_t(8)) != (new mp_limb_t(9)));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_ptr_test()
|
|
{
|
|
mp_ptr bytes0 = new mp_ptr(new byte[0]);
|
|
Assert.IsTrue(bytes0.Size == 0);
|
|
gmp_lib.free(bytes0);
|
|
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
mp_ptr bytes1 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 });
|
|
gmp_lib.mpz_roinit_n(z, bytes1, bytes1.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0x00000088 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000000000000088 }));
|
|
gmp_lib.free(bytes1);
|
|
|
|
mp_ptr bytes2 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 });
|
|
gmp_lib.mpz_roinit_n(z, bytes2, bytes2.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0x00009988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000000000009988 }));
|
|
gmp_lib.free(bytes2);
|
|
|
|
mp_ptr bytes3 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa });
|
|
gmp_lib.mpz_roinit_n(z, bytes3, bytes3.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0x00aa9988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000000000aa9988 }));
|
|
gmp_lib.free(bytes3);
|
|
|
|
mp_ptr bytes4 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb });
|
|
gmp_lib.mpz_roinit_n(z, bytes4, bytes4.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x00000000bbaa9988 }));
|
|
gmp_lib.free(bytes4);
|
|
|
|
mp_ptr bytes5 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc });
|
|
gmp_lib.mpz_roinit_n(z, bytes5, bytes5.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0x000000cc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x000000ccbbaa9988 }));
|
|
gmp_lib.free(bytes5);
|
|
|
|
mp_ptr bytes6 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd });
|
|
gmp_lib.mpz_roinit_n(z, bytes6, bytes6.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0x0000ddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000ddccbbaa9988 }));
|
|
gmp_lib.free(bytes6);
|
|
|
|
mp_ptr bytes7 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee });
|
|
gmp_lib.mpz_roinit_n(z, bytes7, bytes7.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0x00eeddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x00eeddccbbaa9988 }));
|
|
gmp_lib.free(bytes7);
|
|
|
|
mp_ptr bytes8 = new mp_ptr(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff });
|
|
gmp_lib.mpz_roinit_n(z, bytes8, bytes8.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0xffeeddccbbaa9988 }));
|
|
gmp_lib.free(bytes8);
|
|
|
|
mp_ptr ushort1 = new mp_ptr(new ushort[] { 0x1100, 0x3322, 0x5544, 0x7766, 0x9988 });
|
|
gmp_lib.mpz_roinit_n(z, ushort1, ushort1.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0x00009988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000000000009988 }));
|
|
gmp_lib.free(ushort1);
|
|
|
|
mp_ptr ushort2 = new mp_ptr(new ushort[] { 0x1100, 0x3322, 0x5544, 0x7766, 0x9988, 0xbbaa });
|
|
gmp_lib.mpz_roinit_n(z, ushort2, ushort2.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x00000000bbaa9988 }));
|
|
gmp_lib.free(ushort2);
|
|
|
|
mp_ptr ushort3 = new mp_ptr(new ushort[] { 0x1100, 0x3322, 0x5544, 0x7766, 0x9988, 0xbbaa, 0xddcc });
|
|
gmp_lib.mpz_roinit_n(z, ushort3, ushort3.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0x0000ddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x0000ddccbbaa9988 }));
|
|
gmp_lib.free(ushort3);
|
|
|
|
mp_ptr ushort4 = new mp_ptr(new ushort[] { 0x1100, 0x3322, 0x5544, 0x7766, 0x9988, 0xbbaa, 0xddcc, 0xffee });
|
|
gmp_lib.mpz_roinit_n(z, ushort4, ushort4.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0xffeeddccbbaa9988 }));
|
|
gmp_lib.free(ushort4);
|
|
|
|
mp_ptr uint1 = new mp_ptr(new uint[] { 0x33221100, 0x77665544, 0xbbaa9988 });
|
|
gmp_lib.mpz_roinit_n(z, uint1, uint1.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988 }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0x00000000bbaa9988 }));
|
|
gmp_lib.free(uint1);
|
|
|
|
mp_ptr uint2 = new mp_ptr(new uint[] { 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc });
|
|
gmp_lib.mpz_roinit_n(z, uint2, uint2.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0xffeeddccbbaa9988 }));
|
|
gmp_lib.free(uint2);
|
|
|
|
mp_ptr ulong1 = new mp_ptr(new ulong[] { 0x7766554433221100, 0xffeeddccbbaa9988 });
|
|
gmp_lib.mpz_roinit_n(z, ulong1, ulong1.Size);
|
|
if (gmp_lib.mp_bits_per_limb == 32)
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc }));
|
|
else
|
|
Assert.IsTrue(gmp_lib.mpz_limbs_read(z).SequenceEqual(new mp_limb_t[] { 0x7766554433221100, 0xffeeddccbbaa9988 }));
|
|
gmp_lib.free(ulong1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_size_t_test()
|
|
{
|
|
mp_size_t v;
|
|
|
|
byte zero = 0;
|
|
|
|
// Check implicit and explict conversions to mp_size_t.
|
|
v = (byte)zero;
|
|
v = (sbyte)zero;
|
|
v = (ushort)zero;
|
|
v = (short)zero;
|
|
v = (mp_size_t)(uint)zero;
|
|
v = (int)zero;
|
|
v = (mp_size_t)(ulong)zero;
|
|
v = (mp_size_t)(long)zero;
|
|
|
|
// Check implicit and explict conversions from mp_size_t.
|
|
byte b = (byte)v;
|
|
sbyte sb = (sbyte)v;
|
|
ushort us = (ushort)v;
|
|
short s = (short)v;
|
|
uint ui = (uint)v;
|
|
int i = v;
|
|
ulong ul = (ulong)v;
|
|
long l = v;
|
|
|
|
// Check OverflowException cases.
|
|
Assert.IsTrue(Test(() => v = (mp_size_t)uint.MaxValue) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_size_t)long.MaxValue) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (mp_size_t)ulong.MaxValue) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => b = (byte)(new mp_size_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_size_t(int.MinValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new mp_size_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => us = (ushort)(new mp_size_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_size_t(int.MinValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new mp_size_t(int.MaxValue))) == typeof(OverflowException).Name);
|
|
|
|
// Check equality and inequality.
|
|
Object obj = new mp_size_t(8);
|
|
Assert.IsTrue((new mp_size_t(8)).Equals(obj));
|
|
Assert.IsTrue(!(new mp_size_t(8)).Equals(new byte()));
|
|
Assert.IsTrue((new mp_size_t(8)).Equals(new mp_size_t(8)));
|
|
Assert.IsTrue(!(new mp_size_t(8)).Equals(new mp_size_t(9)));
|
|
Assert.IsTrue((new mp_size_t(8)) == (new mp_size_t(8)));
|
|
Assert.IsTrue((new mp_size_t(8)) != (new mp_size_t(9)));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void size_t_test()
|
|
{
|
|
size_t v;
|
|
|
|
byte zero = 0;
|
|
sbyte minusOne = -1;
|
|
|
|
// Check implicit and explict conversions to size_t.
|
|
v = (byte)zero;
|
|
v = (size_t)(sbyte)zero;
|
|
v = (ushort)zero;
|
|
v = (size_t)(short)zero;
|
|
v = (uint)zero;
|
|
v = (size_t)(int)zero;
|
|
v = (ulong)zero;
|
|
v = (size_t)(long)zero;
|
|
|
|
// Check implicit and explict conversions from size_t.
|
|
byte b = (byte)v;
|
|
sbyte sb = (sbyte)v;
|
|
ushort us = (ushort)v;
|
|
short s = (short)v;
|
|
uint ui = (uint)v;
|
|
int i = (int)v;
|
|
ulong ul = v;
|
|
long l = (long)v;
|
|
|
|
// Check OverflowException cases.
|
|
Assert.IsTrue(Test(() => v = (size_t)(sbyte)minusOne) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => v = (size_t)(short)minusOne) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => v = (size_t)(int)minusOne) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => v = (size_t)(long)minusOne) == typeof(OverflowException).Name);
|
|
|
|
Assert.IsTrue(Test(() => b = (byte)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => sb = (sbyte)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => us = (ushort)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => s = (short)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => i = (int)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
Assert.IsTrue(Test(() => ui = (uint)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
//Assert.IsTrue(Test(() => l = (long)(new size_t(ulong.MaxValue))) == typeof(OverflowException).Name);
|
|
|
|
// Check equality and inequality.
|
|
Object obj = new size_t(8);
|
|
Assert.IsTrue((new size_t(8)).Equals(obj));
|
|
Assert.IsTrue(!(new size_t(8)).Equals(new byte()));
|
|
Assert.IsTrue((new size_t(8)).Equals(new size_t(8)));
|
|
Assert.IsTrue(!(new size_t(8)).Equals(new size_t(9)));
|
|
Assert.IsTrue((new size_t(8)) == (new size_t(8)));
|
|
Assert.IsTrue((new size_t(8)) != (new size_t(9)));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void void_ptr_test()
|
|
{
|
|
// Set block pointer to zero.
|
|
void_ptr s = void_ptr.Zero;
|
|
Assert.IsTrue(s.ToIntPtr() == IntPtr.Zero);
|
|
|
|
// Create new block in unmanaged memory.
|
|
s = gmp_lib.allocate(10);
|
|
|
|
// Assert that obj and s are the same pointer.
|
|
object obj = s;
|
|
Assert.IsTrue(s.Equals(obj) == true);
|
|
|
|
// Create new unmanaged string.
|
|
void_ptr t = gmp_lib.allocate(10);
|
|
|
|
// Assert that s and t are distinct block pointers.
|
|
Assert.IsTrue(s.Equals(t) == false);
|
|
|
|
// Check inequality and equality of s and t pointers.
|
|
Assert.IsTrue(s != t);
|
|
gmp_lib.free(t);
|
|
t = s;
|
|
Assert.IsTrue(s == t);
|
|
gmp_lib.free(t);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_t_test()
|
|
{
|
|
// Create new multiple-precision integers.
|
|
mpz_t x = "123 456 789 012 345 678 901 234 567 890";
|
|
mpz_t y = "123 456 789 012 345 678 901 234 567 890";
|
|
mpz_t z = new mpz_t();
|
|
mpz_t result = "246 913 578 024 691 357 802 469 135 780";
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Add integers, and assert result.
|
|
gmp_lib.mpz_add(z, x, y);
|
|
Assert.IsTrue(gmp_lib.mpz_cmp(z, result) == 0);
|
|
|
|
// Release allocated memory for integers.
|
|
gmp_lib.mpz_clears(x, y, z, result, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_t_test()
|
|
{
|
|
// Create new multiple-precision rationals.
|
|
mpq_t x = "123 456 789 012 345 / 0x2 6975 02EC 8AD2";
|
|
mpq_t y = "03 404 420 603 357 571 / 678 901 234 567 890";
|
|
mpq_t z = new mpq_t();
|
|
mpq_t result = "246 913 578 024 690 / 0b10 0110 1001 0111 0101 0000 0010 1110 1100 1000 1010 1101 0010";
|
|
gmp_lib.mpq_init(z);
|
|
|
|
// Add rationals, and assert result.
|
|
gmp_lib.mpq_add(z, x, y);
|
|
Assert.IsTrue(gmp_lib.mpq_cmp(z, result) == 0);
|
|
|
|
// Release allocated memory for rationals.
|
|
gmp_lib.mpq_clears(x, y, z, result, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_t_test()
|
|
{
|
|
// Set default precision to 84 bits.
|
|
gmp_lib.mpf_set_default_prec(32U);
|
|
|
|
// Create new multiple-precision floating-point numbers.
|
|
mpf_t x = "B-16 7048 860D DF79@0";
|
|
mpf_t y = "123 456 789 012 345e0";
|
|
mpf_t z = new mpf_t();
|
|
mpf_t result = "246 913 578 024 690e0";
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Add floating-point numbers, and assert result.
|
|
gmp_lib.mpf_add(z, x, y);
|
|
Assert.IsTrue(gmp_lib.mpf_cmp(z, result) == 0);
|
|
|
|
// Release allocated memory for floating-point numbers.
|
|
gmp_lib.mpf_clears(x, y, z, result, null);
|
|
}
|
|
|
|
//[TestMethod]
|
|
//public void va_list()
|
|
//{
|
|
// object[] args;
|
|
// va_list va_args;
|
|
|
|
// args = new object[] { new ptr<Char>('A') };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Char>)args[0]).Value == 'A');
|
|
|
|
// args = new object[] { new ptr<Byte>(Byte.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Byte>)args[0]).Value == Byte.MinValue);
|
|
|
|
// args = new object[] { new ptr<SByte>(SByte.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<SByte>)args[0]).Value == SByte.MaxValue);
|
|
|
|
// args = new object[] { new ptr<Int16>(Int16.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Int16>)args[0]).Value == Int16.MinValue);
|
|
|
|
// args = new object[] { new ptr<UInt16>(UInt16.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<UInt16>)args[0]).Value == UInt16.MaxValue);
|
|
|
|
// args = new object[] { new ptr<Int32>(Int32.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Int32>)args[0]).Value == Int32.MinValue);
|
|
|
|
// args = new object[] { new ptr<UInt32>(UInt32.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<UInt32>)args[0]).Value == UInt32.MaxValue);
|
|
|
|
// args = new object[] { new ptr<Int64>(Int64.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Int64>)args[0]).Value == Int64.MinValue);
|
|
|
|
// args = new object[] { new ptr<UInt64>(UInt64.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<UInt64>)args[0]).Value == UInt64.MaxValue);
|
|
|
|
// args = new object[] { new ptr<mp_bitcnt_t>(UInt32.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<mp_bitcnt_t>)args[0]).Value == UInt32.MaxValue);
|
|
|
|
// args = new object[] { new ptr<mp_size_t>(Int32.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<mp_size_t>)args[0]).Value == Int32.MinValue);
|
|
|
|
// args = new object[] { new ptr<Single>(Single.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Single>)args[0]).Value == Single.MinValue);
|
|
|
|
// args = new object[] { new ptr<Double>(Double.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<Double>)args[0]).Value == Double.MaxValue);
|
|
|
|
// args = new object[] { new ptr<mp_limb_t>(IntPtr.Size == 4 ? UInt32.MaxValue : UInt64.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<mp_limb_t>)args[0]).Value == (IntPtr.Size == 4 ? UInt32.MaxValue : UInt64.MaxValue));
|
|
|
|
// args = new object[] { new ptr<size_t>(IntPtr.Size == 4 ? UInt32.MaxValue : UInt64.MaxValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<size_t>)args[0]).Value == (IntPtr.Size == 4 ? UInt32.MaxValue : UInt64.MaxValue));
|
|
|
|
// args = new object[] { new ptr<mp_exp_t>(Int32.MinValue) };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((ptr<mp_exp_t>)args[0]).Value == Int32.MinValue);
|
|
|
|
// args = new object[] { new StringBuilder("ABCDEFGHIJ") };
|
|
// va_args = new va_list(args);
|
|
// va_args.RetrieveArgumentValues();
|
|
// Assert.IsTrue(((StringBuilder)args[0]).ToString() == "ABCDEFGHIJ");
|
|
//}
|
|
|
|
#endregion
|
|
|
|
#region "Global variables."
|
|
|
|
[TestMethod]
|
|
public void mp_bits_per_limb()
|
|
{
|
|
int bitsPerLimb = gmp_lib.mp_bits_per_limb;
|
|
Assert.AreEqual(bitsPerLimb, IntPtr.Size * 8);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_bytes_per_limb()
|
|
{
|
|
mp_size_t bytesPerLimb = gmp_lib.mp_bytes_per_limb;
|
|
Assert.AreEqual(bytesPerLimb, (mp_size_t)IntPtr.Size);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_uint_per_limb()
|
|
{
|
|
mp_size_t uintsPerLimb = gmp_lib.mp_uint_per_limb;
|
|
Assert.AreEqual(uintsPerLimb, (mp_size_t)(IntPtr.Size / 4));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_errno()
|
|
{
|
|
int errno = gmp_lib.gmp_errno;
|
|
Assert.AreEqual(errno, 0);
|
|
gmp_lib.gmp_errno = 100;
|
|
errno = gmp_lib.gmp_errno;
|
|
Assert.AreEqual(errno, 100);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_version()
|
|
{
|
|
string version = gmp_lib.gmp_version;
|
|
Assert.AreEqual(version, "6.1.2");
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Memory allocation functions."
|
|
|
|
[TestMethod]
|
|
public void mp_get_memory_functions()
|
|
{
|
|
allocate_function allocate;
|
|
reallocate_function reallocate;
|
|
free_function free;
|
|
|
|
// Retrieve the GMP memory allocation functions.
|
|
allocate = null; reallocate = null; free = null;
|
|
gmp_lib.mp_get_memory_functions(ref allocate, ref reallocate, ref free);
|
|
Assert.IsTrue(allocate != null && reallocate != null && free != null);
|
|
|
|
// Allocate and free memory.
|
|
void_ptr p = allocate(100);
|
|
free(p, 100);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mp_set_memory_functions()
|
|
{
|
|
// Retrieve GMP default memory allocation functions.
|
|
allocate_function default_allocate = null;
|
|
reallocate_function default_reallocate = null;
|
|
free_function default_free = null;
|
|
gmp_lib.mp_get_memory_functions(ref default_allocate, ref default_reallocate, ref default_free);
|
|
|
|
// Create and set new memory allocation functions that count the number of times they are called.
|
|
int counter = 0;
|
|
allocate_function new_allocate = (size_t alloc_size) => { counter++; return default_allocate(alloc_size); };
|
|
reallocate_function new_reallocate = (void_ptr ptr, size_t old_size, size_t new_size) => { counter++; return default_reallocate(ptr, old_size, new_size); };
|
|
free_function new_free = (void_ptr ptr, size_t size) => { counter++; default_free(ptr, size); };
|
|
gmp_lib.mp_set_memory_functions(new_allocate, new_reallocate, new_free);
|
|
|
|
// Retrieve GMP memory allocation functions.
|
|
allocate_function allocate = null;
|
|
reallocate_function reallocate = null;
|
|
free_function free = null;
|
|
gmp_lib.mp_get_memory_functions(ref allocate, ref reallocate, ref free);
|
|
|
|
// Call memory function and assert calls count.
|
|
void_ptr p = allocate(10);
|
|
Assert.IsTrue(counter == 1);
|
|
|
|
reallocate(p, 10, 20);
|
|
Assert.IsTrue(counter == 2);
|
|
|
|
free(p, 20);
|
|
Assert.IsTrue(counter == 3);
|
|
|
|
// Restore default memory allocation functions.
|
|
gmp_lib.mp_set_memory_functions(null, null, null);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Random number routines."
|
|
|
|
[TestMethod]
|
|
public void gmp_randinit_default()
|
|
{
|
|
// Create new random number generator state.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
|
|
// Initialize state with default random number generator algorithm.
|
|
gmp_lib.gmp_randinit_default(state);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randinit_lc_2exp()
|
|
{
|
|
// Create new random number generator state.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
|
|
// Initialize state with a linear congruential random number generator algorithm.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 100000U);
|
|
gmp_lib.gmp_randinit_lc_2exp(state, a, 13, 300);
|
|
|
|
// Free all memory occupied by state and a.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpz_clear(a);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randinit_lc_2exp_size()
|
|
{
|
|
// Create new random number generator state.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
|
|
// Initialize state with a linear congruential random number generator algorithm.
|
|
gmp_lib.gmp_randinit_lc_2exp_size(state, 30);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randinit_mt()
|
|
{
|
|
// Create new random number generator state.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
|
|
// Initialize state with Mersenne Twister random number generator algorithm.
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randinit_set()
|
|
{
|
|
// Create new random number generator state, and initialize state with the Mersenne Twister algorithm.
|
|
gmp_randstate_t op = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(op);
|
|
|
|
// Create new random number generator state, and initialize it with the state op.
|
|
gmp_randstate_t rop = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_set(rop, op);
|
|
|
|
// Free all memory occupied by op and rop.
|
|
gmp_lib.gmp_randclear(op);
|
|
gmp_lib.gmp_randclear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randseed()
|
|
{
|
|
// Create new random number generator state, and initialize state with the Mersenne Twister algorithm.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
|
|
// Seed random number generator.
|
|
mpz_t seed = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(seed, 100000U);
|
|
gmp_lib.gmp_randseed(state, seed);
|
|
|
|
// Free all memory occupied by state and seed.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpz_clear(seed);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_randseed_ui()
|
|
{
|
|
// Create new random number generator state, and initialize state with the Mersenne Twister algorithm.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
|
|
// Seed random number generator.
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_urandomb_ui()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Generate a random integer in the range [0, 2^8-1].
|
|
uint rand = gmp_lib.gmp_urandomb_ui(state, 8);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_urandomm_ui()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 1000U);
|
|
|
|
// Generate a random integer in the range [0, 8-1].
|
|
uint rand = gmp_lib.gmp_urandomm_ui(state, 8);
|
|
|
|
// Free all memory occupied by state.
|
|
gmp_lib.gmp_randclear(state);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Formatted output routines."
|
|
|
|
[TestMethod]
|
|
public void gmp_asprintf()
|
|
{
|
|
// Create pointer to unmanaged character string pointer.
|
|
ptr<char_ptr> str = new ptr<char_ptr>();
|
|
|
|
mpz_t z = "123456";
|
|
mpq_t q = "123/456";
|
|
mpf_t f = "12345e6";
|
|
mp_limb_t m = 123456;
|
|
|
|
// Print to newly allocated unmanaged memory string.
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Zd - %QX - %Fa - %Mo", z, q, f, m) == 42);
|
|
Assert.IsTrue(str.Value.ToString() == "123456 - 7B/1C8 - 0x2.dfd1c04p+32 - 361100");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.Value.ToString() == "1E240");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "361100");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "123/456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "123/456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%QX", q) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "7B/1C8");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "173/710");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "1.234500e+10");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.Value.ToString() == "12345000000.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.Value.ToString() == "1.2345e+10");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.Value.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Md", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%MX", m) == 5);
|
|
Assert.IsTrue(str.Value.ToString() == "1E240");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "361100");
|
|
gmp_lib.free(str.Value);
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.Value.ToString() == "11111111111");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.Value.ToString() == "11111111111");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.Value.ToString() == "2964619C7");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "122621414707");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "A");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000e+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000e+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000E+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000E+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
//Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%a", (Double)1.0) == 13);
|
|
//Assert.IsTrue(str.Value.ToString() == "0x1.000000p+0");
|
|
//gmp_lib.free(str.Value);
|
|
//Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%a", (Single)1.0) == 13);
|
|
//Assert.IsTrue(str.Value.ToString() == "0x1.000004p+0");
|
|
//gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "Hello World!");
|
|
gmp_lib.free(str.Value);
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
Assert.IsTrue(p.Value == 6);
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%p", p) == 2 * IntPtr.Size);
|
|
gmp_lib.free(str.Value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_vasprintf()
|
|
{
|
|
ptr<char_ptr> str = new ptr<char_ptr>();
|
|
|
|
mpz_t z = "123456";
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.Value.ToString() == "1E240");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "361100");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
mpq_t q = "123/456";
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "123/456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "123/456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%QX", q) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "7B/1C8");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.Value.ToString() == "173/710");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
mpf_t f = "12345e6";
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "1.234500e+10");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.Value.ToString() == "12345000000.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.Value.ToString() == "1.2345e+10");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.Value.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.free(str.Value);
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
mp_limb_t m = 123456;
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Md", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%MX", m) == 5);
|
|
Assert.IsTrue(str.Value.ToString() == "1E240");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "361100");
|
|
gmp_lib.free(str.Value);
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.Value.ToString() == "11111111111");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.Value.ToString() == "11111111111");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.Value.ToString() == "2964619C7");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "122621414707");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "A");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000e+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000e+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000E+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.Value.ToString() == "1.000000E+000");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.Value.ToString() == "1");
|
|
gmp_lib.free(str.Value);
|
|
|
|
//Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%a", (Double)1.0) == 13);
|
|
//Assert.IsTrue(str.Value.ToString() == "0x1.000000p+0");
|
|
//gmp_lib.free(str.Value);
|
|
//Assert.IsTrue(gmp_lib.gmp_asprintf(str, "%a", (Single)1.0) == 13);
|
|
//Assert.IsTrue(str.Value.ToString() == "0x1.000004p+0");
|
|
//gmp_lib.free(str.Value);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.Value.ToString() == "Hello World!");
|
|
gmp_lib.free(str.Value);
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.Value.ToString() == "123456");
|
|
Assert.IsTrue(p.Value == 6);
|
|
gmp_lib.free(str.Value);
|
|
Assert.IsTrue(gmp_lib.gmp_vasprintf(str, "%p", p) == 2 * IntPtr.Size);
|
|
gmp_lib.free(str.Value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_fprintf()
|
|
{
|
|
// Create unique file pathname and a file pointer.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
|
|
mpz_t z = "123456";
|
|
mpq_t q = "123/456";
|
|
mpf_t f = "12345e6";
|
|
mp_limb_t m = 123456;
|
|
|
|
// Open file stream and print to it.
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Zd - %QX - %Fa - %Mo", z, q, f, m) == 42);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456 - 7B/1C8 - 0x2.dfd1c04p+32 - 361100");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Zd", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Zi", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%ZX", z) == 5);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1E240");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Zo", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Qd", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123/456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Qi", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123/456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%QX", q) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "7B/1C8");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Qo", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Fe", f) == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.234500e+10");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Ff", f) == 18);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "12345000000.000000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Fg", f) == 10);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.2345e+10");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Fa", f) == 15);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Md", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Mi", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%MX", m) == 5);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1E240");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Mo", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Nd", n, n.Size) == 11);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "11111111111");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Ni", n, n.Size) == 11);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "11111111111");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%NX", n, n.Size) == 9);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "2964619C7");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%No", n, n.Size) == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "122621414707");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%hd", (short)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%hhd", (byte)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%hhc", 'A') == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "A");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%ld", (Int32)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%lld", (Int64)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%Md", (size_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%d", (mp_bitcnt_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%d", (mp_size_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%d", (mp_exp_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%f", (Double)1.0) == 8);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%f", (Single)1.0) == 8);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%e", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000e+000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%e", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000e+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%g", (Double)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%g", (Single)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%E", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000E+000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%E", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000E+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%G", (Double)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%G", (Single)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%a", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x1.000000p+0");
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%a", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x1.000000p+0");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%s", "Hello World!") == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "123456%n", p) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
Assert.IsTrue(p.Value == 6);
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_fprintf(stream, "%p", p) == 2 * IntPtr.Size);
|
|
fclose(stream.Value.Value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_vfprintf()
|
|
{
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
|
|
mpz_t z = "123456";
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Zd", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Zi", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%ZX", z) == 5);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1E240");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Zo", z) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
mpq_t q = "123/456";
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Qd", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123/456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Qi", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123/456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%QX", q) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "7B/1C8");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Qo", q) == 7);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
mpf_t f = "12345e6";
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Fe", f) == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.234500e+10");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Ff", f) == 18);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "12345000000.000000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Fg", f) == 10);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.2345e+10");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Fa", f) == 15);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
mp_limb_t m = 123456;
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Md", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Mi", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%MX", m) == 5);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1E240");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Mo", m) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Nd", n, n.Size) == 11);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "11111111111");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Ni", n, n.Size) == 11);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "11111111111");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%NX", n, n.Size) == 9);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "2964619C7");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%No", n, n.Size) == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "122621414707");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%hd", (short)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%hhd", (byte)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%hhc", 'A') == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "A");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%ld", (Int32)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%lld", (Int64)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%Md", (size_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%d", (mp_bitcnt_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%d", (mp_size_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%d", (mp_exp_t)1) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%f", (Double)1.0) == 8);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%f", (Single)1.0) == 8);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%e", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000e+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%e", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000e+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%g", (Double)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%g", (Single)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%E", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000E+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%E", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1.000000E+000");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%G", (Double)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%G", (Single)1.0) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "1");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%a", (Double)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x1.000000p+0");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%a", (Single)1.0) == 13);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "0x1.000000p+0");
|
|
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%s", "Hello World!") == 12);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "123456%n", p) == 6);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(System.IO.File.ReadAllText(pathname) == "123456");
|
|
|
|
Assert.IsTrue(p.Value == 6);
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.gmp_vfprintf(stream, "%p", p) == 2 * IntPtr.Size);
|
|
fclose(stream.Value.Value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_snprintf()
|
|
{
|
|
// Allocate unmanaged string with 50 characters.
|
|
char_ptr str = new char_ptr(".................................................");
|
|
|
|
mpz_t z = "123456";
|
|
mpq_t q = "123/456";
|
|
mpf_t f = "12345e6";
|
|
mp_limb_t m = 123456;
|
|
|
|
// Print to string.
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 50, "%Zd - %QX - %Fa - %Mo", z, q, f, m) == 42);
|
|
Assert.IsTrue(str.ToString() == "123456 - 7B/1C8 - 0x2.dfd1c04p+32 - 361100");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%QX", q) == 6);
|
|
Assert.IsTrue(str.ToString() == "7B/1C8");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.ToString() == "1.234500e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.ToString() == "12345000000.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.ToString() == "1.2345e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Md", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%MX", m) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.ToString() == "2964619C7");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.ToString() == "122621414707");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.ToString() == "A");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
//Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%a", (Double)1.0) == 13);
|
|
//Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
//Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%a", (Single)1.0) == 13);
|
|
//Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.ToString() == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(p.Value == 6);
|
|
Assert.IsTrue(gmp_lib.gmp_snprintf(str, 41, "%p", p) == 2 * IntPtr.Size);
|
|
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_vsnprintf()
|
|
{
|
|
char_ptr str = new char_ptr(".........................................");
|
|
|
|
mpz_t z = "123456";
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
mpq_t q = "123/456";
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%QX", q) == 6);
|
|
Assert.IsTrue(str.ToString() == "7B/1C8");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
mpf_t f = "12345e6";
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.ToString() == "1.234500e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.ToString() == "12345000000.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.ToString() == "1.2345e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
mp_limb_t m = 123456;
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Md", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%MX", m) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.ToString() == "2964619C7");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.ToString() == "122621414707");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.ToString() == "A");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
//Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%a", (Double)1.0) == 13);
|
|
//Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
//Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%a", (Single)1.0) == 13);
|
|
//Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.ToString() == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(p.Value == 6);
|
|
Assert.IsTrue(gmp_lib.gmp_vsnprintf(str, 41, "%p", p) == 2 * IntPtr.Size);
|
|
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_sprintf()
|
|
{
|
|
// Allocate unmanaged string with 50 characters.
|
|
char_ptr str = new char_ptr(".................................................");
|
|
|
|
mpz_t z = "123456";
|
|
mpq_t q = "123/456";
|
|
mpf_t f = "12345e6";
|
|
mp_limb_t m = 123456;
|
|
|
|
// Print to string.
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Zd - %QX - %Fa - %Mo", z, q, f, m) == 42);
|
|
Assert.IsTrue(str.ToString() == "123456 - 7B/1C8 - 0x2.dfd1c04p+32 - 361100");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%QX", q) == 6);
|
|
Assert.IsTrue(str.ToString() == "7B/1C8");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.ToString() == "1.234500e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.ToString() == "12345000000.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.ToString() == "1.2345e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Md", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%MX", m) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.ToString() == "2964619C7");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.ToString() == "122621414707");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.ToString() == "A");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%a", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%a", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.ToString() == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(p.Value == 6);
|
|
Assert.IsTrue(gmp_lib.gmp_sprintf(str, "%p", p) == 2 * IntPtr.Size);
|
|
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_vsprintf()
|
|
{
|
|
// Create string.
|
|
char_ptr str = new char_ptr(".........................................");
|
|
|
|
mpz_t z = "123456";
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Zd", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Zi", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%ZX", z) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Zo", z) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
mpq_t q = "123/456";
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Qd", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Qi", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%QX", q) == 6);
|
|
Assert.IsTrue(str.ToString() == "7B/1C8");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Qo", q) == 7);
|
|
Assert.IsTrue(str.ToString() == "173/710");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
mpf_t f = "12345e6";
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Fe", f) == 12);
|
|
Assert.IsTrue(str.ToString() == "1.234500e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Ff", f) == 18);
|
|
Assert.IsTrue(str.ToString() == "12345000000.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Fg", f) == 10);
|
|
Assert.IsTrue(str.ToString() == "1.2345e+10");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Fa", f) == 15);
|
|
Assert.IsTrue(str.ToString() == "0x2.dfd1c04p+32");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
mp_limb_t m = 123456;
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Md", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Mi", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%MX", m) == 5);
|
|
Assert.IsTrue(str.ToString() == "1E240");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Mo", m) == 6);
|
|
Assert.IsTrue(str.ToString() == "361100");
|
|
|
|
mp_ptr n = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Nd", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Ni", n, n.Size) == 11);
|
|
Assert.IsTrue(str.ToString() == "11111111111");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%NX", n, n.Size) == 9);
|
|
Assert.IsTrue(str.ToString() == "2964619C7");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%No", n, n.Size) == 12);
|
|
Assert.IsTrue(str.ToString() == "122621414707");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%hd", (short)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%hhd", (byte)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%hhc", 'A') == 1);
|
|
Assert.IsTrue(str.ToString() == "A");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%ld", (Int32)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%lld", (Int64)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
// Instead of %z, use %M.
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%Md", (size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%d", (mp_bitcnt_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%d", (mp_size_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%d", (mp_exp_t)1) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%f", (Double)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%f", (Single)1.0) == 8);
|
|
Assert.IsTrue(str.ToString() == "1.000000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%e", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%e", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000e+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%g", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%g", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%E", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%E", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "1.000000E+000");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%G", (Double)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%G", (Single)1.0) == 1);
|
|
Assert.IsTrue(str.ToString() == "1");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%a", (Double)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "0x1.000000p+0");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%a", (Single)1.0) == 13);
|
|
Assert.IsTrue(str.ToString() == "0x1.000004p+0");
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%s", "Hello World!") == 12);
|
|
Assert.IsTrue(str.ToString() == "Hello World!");
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "123456%n", p) == 6);
|
|
Assert.IsTrue(str.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_vsprintf(str, "%p", p) == 2 * IntPtr.Size);
|
|
//Assert.IsTrue(str.ToString() == p.ToIntPtr().ToString("X0" + (2 * IntPtr.Size).ToString()));
|
|
|
|
// Free allocated unmanaged memory.
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Formatted input routines."
|
|
|
|
[TestMethod]
|
|
public void gmp_fscanf()
|
|
{
|
|
// Create unique filename and stream pointer.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
|
|
mpz_t z = "0";
|
|
mpq_t q = "0";
|
|
mpf_t f = "0";
|
|
ptr<Char> c = new ptr<Char>('0');
|
|
ptr<mp_size_t> zt = new ptr<mp_size_t>(0);
|
|
ptr<Double> dbl = new ptr<Double>(0);
|
|
|
|
// Write string to file, and then read values from it.
|
|
System.IO.File.WriteAllText(pathname, "123456 7B/1C8 1.234500e+10 A 10 1.000000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Zd %QX %Fe %hhc %d %lf", z, q, f, c, zt, dbl) == 6);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert values read.
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
Assert.IsTrue(c.Value == 'A');
|
|
Assert.IsTrue(zt.Value == 10);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
|
|
System.IO.File.WriteAllText(pathname, "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Zd", z) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
System.IO.File.WriteAllText(pathname, "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Zi", z) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
System.IO.File.WriteAllText(pathname, "1E240");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%ZX", z) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
System.IO.File.WriteAllText(pathname, "361100");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, " %Zo", z) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
System.IO.File.WriteAllText(pathname, "123/456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Qd", q) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
System.IO.File.WriteAllText(pathname, "123/456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Qi", q) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
System.IO.File.WriteAllText(pathname, "7B/1C8");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%QX", q) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
System.IO.File.WriteAllText(pathname, "173/710");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Qo", q) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
System.IO.File.WriteAllText(pathname, "1.234500e+10");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Fe", f) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
System.IO.File.WriteAllText(pathname, "12345000000.000000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Ff", f) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
System.IO.File.WriteAllText(pathname, "1.2345e+10");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Fg", f) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
//System.IO.File.WriteAllText(pathname, "0x2.dfd1c04p+32");
|
|
//_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
//Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%Fa", f) == 1);
|
|
//fclose(stream.Value.Value);
|
|
//Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
ptr<short> s = new ptr<short>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%hd", s) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(s.Value == 1);
|
|
ptr<byte> b = new ptr<byte>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%hhd", b) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(b.Value == 1);
|
|
System.IO.File.WriteAllText(pathname, "A");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%hhc", c) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(c.Value == 'A');
|
|
ptr<Int32> i = new ptr<Int32>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%ld", i) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(i.Value == 1);
|
|
ptr<Int64> l = new ptr<Int64>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%lld", l) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(l.Value == 1);
|
|
|
|
ptr<size_t> st = new ptr<size_t>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, IntPtr.Size == 4 ? "%d" : "%ld", st) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(st.Value == 1);
|
|
ptr<mp_bitcnt_t> bt = new ptr<mp_bitcnt_t>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%d", bt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(bt.Value == 1);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%d", zt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(zt.Value == 1);
|
|
ptr<mp_exp_t> et = new ptr<mp_exp_t>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%d", et) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(et.Value == 1);
|
|
|
|
ptr<Single> flt = new ptr<Single>(0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%lf", dbl) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%f", flt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%le", dbl) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%e", flt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%lg", dbl) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%g", flt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
|
|
System.IO.File.WriteAllText(pathname, "1.000000E+000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%lE", dbl) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(dbl.Value == 1);
|
|
System.IO.File.WriteAllText(pathname, "1.000000E+000");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%E", flt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(flt.Value == 1);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%lG", dbl) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(dbl.Value == 1);
|
|
System.IO.File.WriteAllText(pathname, "1");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%G", flt) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(flt.Value == 1);
|
|
|
|
//System.IO.File.WriteAllText(pathname, "0x1.000000p+0");
|
|
//_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
//Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%a", dbl) == 1);
|
|
//fclose(stream.Value.Value);
|
|
//Assert.IsTrue(dbl.Value == 1);
|
|
//System.IO.File.WriteAllText(pathname, "0x1.000000p+0");
|
|
//_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
//Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%a", flt) == 1);
|
|
//fclose(stream.Value.Value);
|
|
//Assert.IsTrue(flt.Value == 1);
|
|
|
|
System.IO.File.WriteAllText(pathname, "Hello World!");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
char_ptr str = new char_ptr("________________________");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%s", str) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(str.ToString() == "Hello");
|
|
gmp_lib.free(str);
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
System.IO.File.WriteAllText(pathname, "123456");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "123456%n", p) == 0);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue(p.Value == 6);
|
|
ptr<IntPtr> ptr = new ptr<IntPtr>();
|
|
System.IO.File.WriteAllText(pathname, IntPtr.Size == 4 ? "0060F0F4" : "000000000060F0F4");
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.gmp_fscanf(stream, "%p", ptr) == 1);
|
|
fclose(stream.Value.Value);
|
|
Assert.IsTrue((UInt64)ptr.Value == 6353140);
|
|
|
|
System.IO.File.Delete(pathname);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void gmp_sscanf()
|
|
{
|
|
mpz_t z = "0";
|
|
mpq_t q = "0";
|
|
mpf_t f = "0";
|
|
ptr<Char> c = new ptr<Char>('0');
|
|
ptr<mp_size_t> zt = new ptr<mp_size_t>(0);
|
|
ptr<Double> dbl = new ptr<Double>(0);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123456 7B/1C8 1.234500e+10 A 10 1.000000", "%Zd %QX %Fe %hhc %d %lf", z, q, f, c, zt, dbl) == 6);
|
|
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
Assert.IsTrue(c.Value == 'A');
|
|
Assert.IsTrue(zt.Value == 10);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123456", "%Zd", z) == 1);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123456", "%Zi", z) == 1);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1E240", "%ZX", z) == 1);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("361100", "%Zo", z) == 1);
|
|
Assert.IsTrue(z.ToString() == "123456");
|
|
gmp_lib.mpz_clear(z);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123/456", "%Qd", q) == 1);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123/456", "%Qi", q) == 1);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("7B/1C8", "%QX", q) == 1);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("173/710", "%Qo", q) == 1);
|
|
Assert.IsTrue(q.ToString() == "123/456");
|
|
gmp_lib.mpq_clear(q);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.234500e+10", "%Fe", f) == 1);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("12345000000.000000", "%Ff", f) == 1);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.2345e+10", "%Fg", f) == 1);
|
|
Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
//Assert.IsTrue(gmp_lib.gmp_sscanf("0x2.dfd1c04p+32", "%Fa", f) == 1);
|
|
//Assert.IsTrue(f.ToString() == "0.12345e11");
|
|
gmp_lib.mpf_clear(f);
|
|
|
|
ptr<short> s = new ptr<short>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%hd", s) == 1);
|
|
Assert.IsTrue(s.Value == 1);
|
|
ptr<byte> b = new ptr<byte>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%hhd", b) == 1);
|
|
Assert.IsTrue(b.Value == 1);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("A", "%hhc", c) == 1);
|
|
Assert.IsTrue(c.Value == 'A');
|
|
ptr<Int32> i = new ptr<Int32>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%ld", i) == 1);
|
|
Assert.IsTrue(i.Value == 1);
|
|
ptr<Int64> l = new ptr<Int64>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%lld", l) == 1);
|
|
Assert.IsTrue(l.Value == 1);
|
|
|
|
ptr<size_t> st = new ptr<size_t>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", IntPtr.Size == 4 ? "%d" : "%ld", st) == 1);
|
|
Assert.IsTrue(st.Value == 1);
|
|
ptr<mp_bitcnt_t> bt = new ptr<mp_bitcnt_t>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%d", bt) == 1);
|
|
Assert.IsTrue(bt.Value == 1);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%d", zt) == 1);
|
|
Assert.IsTrue(zt.Value == 1);
|
|
ptr<mp_exp_t> et = new ptr<mp_exp_t>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%d", et) == 1);
|
|
Assert.IsTrue(et.Value == 1);
|
|
|
|
ptr<Single> flt = new ptr<Single>(0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000", "%lf", dbl) == 1);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000", "%f", flt) == 1);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000e+000", "%le", dbl) == 1);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000e+000", "%e", flt) == 1);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%lg", dbl) == 1);
|
|
Assert.IsTrue(dbl.Value == 1.0);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%g", flt) == 1);
|
|
Assert.IsTrue(flt.Value == 1.0);
|
|
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000E+000", "%lE", dbl) == 1);
|
|
Assert.IsTrue(dbl.Value == 1);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1.000000E+000", "%E", flt) == 1);
|
|
Assert.IsTrue(flt.Value == 1);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%lG", dbl) == 1);
|
|
Assert.IsTrue(dbl.Value == 1);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("1", "%G", flt) == 1);
|
|
Assert.IsTrue(flt.Value == 1);
|
|
|
|
//Assert.IsTrue(gmp_lib.gmp_sscanf("0x1.000000p+0", "%a", dbl) == 1);
|
|
//Assert.IsTrue(dbl.Value == 1);
|
|
//Assert.IsTrue(gmp_lib.gmp_sscanf("0x1.000000p+0", "%a", flt) == 1);
|
|
//Assert.IsTrue(flt.Value == 1);
|
|
|
|
char_ptr str = new char_ptr("________________________");
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("Hello World!", "%s", str) == 1);
|
|
Assert.IsTrue(str.ToString() == "Hello");
|
|
gmp_lib.free(str);
|
|
|
|
ptr<int> p = new ptr<int>(12);
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf("123456", "123456%n", p) == 0);
|
|
Assert.IsTrue(p.Value == 6);
|
|
ptr<IntPtr> ptr = new ptr<IntPtr>();
|
|
Assert.IsTrue(gmp_lib.gmp_sscanf(IntPtr.Size == 4 ? "0060F0F4" : "000000000060F0F4", "%p", ptr) == 1);
|
|
Assert.IsTrue((UInt64)ptr.Value == 6353140);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Integer (i.e. Z) routines."
|
|
|
|
[TestMethod]
|
|
public void _mpz_realloc()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x to a 77-bit integer.
|
|
char_ptr value = new char_ptr("1000 0000 0000 0000 0000");
|
|
gmp_lib.mpz_set_str(x, value, 16);
|
|
|
|
// Resize x to 50 limbs, and assert that its value has not changed.
|
|
gmp_lib._mpz_realloc(x, 50);
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 16, x);
|
|
Assert.IsTrue(s.ToString() == "1000 0000 0000 0000 0000".Replace(" ", ""));
|
|
|
|
// Resize x to 1 limb, and assert that its value has changed to 0.
|
|
gmp_lib._mpz_realloc(x, 1);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and string values.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_abs()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = |x|.
|
|
gmp_lib.mpz_abs(z, x);
|
|
|
|
// Assert that z is |x|.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 10000);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_add()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 12222.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x + y.
|
|
gmp_lib.mpz_add(z, x, y);
|
|
|
|
// Assert that z is the sum of x and y.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(z) == 22222U);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_add_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 0.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Increment x twice by 101999.
|
|
gmp_lib.mpz_add_ui(x, x, 101999U);
|
|
gmp_lib.mpz_add_ui(x, x, 101999U);
|
|
|
|
// Assert that x is 203998.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(x) == 203998U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_addmul()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 12222.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 20000.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(z, 20000U);
|
|
|
|
// Set z += x * y.
|
|
gmp_lib.mpz_addmul(z, x, y);
|
|
|
|
// Assert that z has been incremented by 10000 * 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 20000U + 10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_addmul_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 20000.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(z, 20000);
|
|
|
|
// Set z += x * 12222.
|
|
gmp_lib.mpz_addmul_ui(z, x, 12222U);
|
|
|
|
// Assert that z has been incremented by -10000 * 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 20000 + -10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_and()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the bitwise and of op1 and op2.
|
|
gmp_lib.mpz_and(rop, op1, op2);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_bin_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 4.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 4);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the binomial coefficient (n:2).
|
|
gmp_lib.mpz_bin_ui(rop, n, 2U);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for n and rop.
|
|
gmp_lib.mpz_clears(n, rop, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_bin_uiui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the binomial coefficient (4:2).
|
|
gmp_lib.mpz_bin_uiui(rop, 4U, 2U);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_q()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = ceiling(n / d).
|
|
gmp_lib.mpz_cdiv_q(q, n, d);
|
|
|
|
// Assert that q is ceiling(10000 / 3).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3334);
|
|
|
|
// Release unmanaged memory allocated for n, d, and q.
|
|
gmp_lib.mpz_clears(n, d, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_q_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = ceiling(n / 2^2).
|
|
gmp_lib.mpz_cdiv_q_2exp(q, n, 2U);
|
|
|
|
// Assert that q is ceiling(10001 / 4).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 2501);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_q_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = ceiling(n / 3) and return r = n - 3 * q.
|
|
// Assert q and r values.
|
|
Assert.IsTrue(gmp_lib.mpz_cdiv_q_ui(q, n, 3U) == 2U);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3334);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_qr()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = ceiling(n / 3) and r = n - d * q.
|
|
gmp_lib.mpz_cdiv_qr(q, r, n, d);
|
|
|
|
// Assert that q is 3334, and that r is -2.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3334);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == -2);
|
|
|
|
// Release unmanaged memory allocated for n, d, q, and r.
|
|
gmp_lib.mpz_clears(n, d, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_qr_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = ceiling(n / 3), r = n - d * q, and return r.
|
|
Assert.IsTrue(gmp_lib.mpz_cdiv_qr_ui(q, r, n, 3U) == 2U);
|
|
|
|
// Assert that q is 3334, and that r is -2.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3334);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == -2);
|
|
|
|
// Release unmanaged memory allocated for n, q, and r.
|
|
gmp_lib.mpz_clears(n, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_r()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - d * ceiling(n / d).
|
|
gmp_lib.mpz_cdiv_r(r, n, d);
|
|
|
|
// Assert that r is -2.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == -2);
|
|
|
|
// Release unmanaged memory allocated for n, d, and r.
|
|
gmp_lib.mpz_clears(n, d, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_r_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 2^2 * ceiling(n / 2^2)
|
|
gmp_lib.mpz_cdiv_r_2exp(r, n, 2U);
|
|
|
|
// Assert that r is -3.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == -3);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_r_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 3 * ceiling(n / 3), and return |r|.
|
|
Assert.IsTrue(gmp_lib.mpz_cdiv_r_ui(r, n, 3U) == 2U);
|
|
|
|
// Assert that r is -2.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == -2);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cdiv_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Assert that returned value is |n - 3 * ceiling(n / 3)|.
|
|
Assert.IsTrue(gmp_lib.mpz_cdiv_ui(n, 3U) == 2U);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_clear()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Assert that the value of x is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(x) == 0U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_clears()
|
|
{
|
|
// Create new integers x1, x2 and x3.
|
|
mpz_t x1 = new mpz_t();
|
|
mpz_t x2 = new mpz_t();
|
|
mpz_t x3 = new mpz_t();
|
|
|
|
// Initialize the integers.
|
|
gmp_lib.mpz_inits(x1, x2, x3, null);
|
|
|
|
// Assert that their value is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x1) == 0);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x2) == 0);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x3) == 0);
|
|
|
|
// Release unmanaged memory allocated for the integers.
|
|
gmp_lib.mpz_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_clrbit()
|
|
{
|
|
// Create, initialize, and set the value of rop to 70.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(rop, 70);
|
|
|
|
// Clear bit 3 of rop.
|
|
gmp_lib.mpz_clrbit(rop, 3U);
|
|
|
|
// Assert that rop is 70.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 70);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmp()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Assert that op1 < op2.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp(op1, op2) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpz_clears(op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmp_d()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Assert that op1 < 70.0.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp_d(op1, 70.0) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmp_si()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Assert that op1 < 70.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp_si(op1, 70) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmp_ui()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Assert that op1 < 70.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp_ui(op1, 70U) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmpabs()
|
|
{
|
|
// Create, initialize, and set the value of op1 to -63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op1, -63);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Assert that |op1| < |op2|.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp(op1, op2) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpz_clears(op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmpabs_d()
|
|
{
|
|
// Create, initialize, and set the value of op1 to -63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op1, -63);
|
|
|
|
// Assert that |op1| < |-70.0|.
|
|
Assert.IsTrue(gmp_lib.mpz_cmpabs_d(op1, -70.0) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_cmpabs_ui()
|
|
{
|
|
// Create, initialize, and set the value of op1 to -63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op1, -63);
|
|
|
|
// Assert that |op1| < |70|.
|
|
Assert.IsTrue(gmp_lib.mpz_cmpabs_ui(op1, 70U) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_com()
|
|
{
|
|
// Create, initialize, and set the value of op to 63.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 63U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the one's complement of op.
|
|
gmp_lib.mpz_com(rop, op);
|
|
|
|
// Assert that rop is -64.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == -64);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpz_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_combit()
|
|
{
|
|
// Create, initialize, and set the value of rop to 70.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(rop, 70);
|
|
|
|
// Complement bit 3 of rop.
|
|
gmp_lib.mpz_combit(rop, 3U);
|
|
|
|
// Assert that rop is 78.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 78);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_congruent_p()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(n, 10000U);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(d, 3U);
|
|
|
|
// Create, initialize, and set the value of c to 1.
|
|
mpz_t c = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(c, 1U);
|
|
|
|
// Assert that n is congruent to c mod d.
|
|
Assert.IsTrue(gmp_lib.mpz_congruent_p(n, c, d) > 0);
|
|
|
|
// Release unmanaged memory allocated for n, d, and c.
|
|
gmp_lib.mpz_clears(n, d, c, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_congruent_2exp_p()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(n, 10001U);
|
|
|
|
// Create, initialize, and set the value of b to 1.
|
|
mpz_t c = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(c, 1U);
|
|
|
|
// Assert that n is congruent to c mod 2^3.
|
|
Assert.IsTrue(gmp_lib.mpz_congruent_2exp_p(n, c, 3U) > 0);
|
|
|
|
// Release unmanaged memory allocated for n and c.
|
|
gmp_lib.mpz_clears(n, c, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_congruent_ui_p()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(n, 10000U);
|
|
|
|
// Assert that n is congruent to 1 mod 3.
|
|
Assert.IsTrue(gmp_lib.mpz_congruent_ui_p(n, 1U, 3U) > 0);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_divexact()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 5.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 5U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x / y.
|
|
gmp_lib.mpz_divexact(z, x, y);
|
|
|
|
// Assert that z is 2000.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 2000);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_divexact_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x / 5.
|
|
gmp_lib.mpz_divexact_ui(z, x, 5U);
|
|
|
|
// Assert that z is 2000.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 2000);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_divisible_p()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 5.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 5U);
|
|
|
|
// Assert that x is divisible by y.
|
|
Assert.IsTrue(gmp_lib.mpz_divisible_p(x, y) > 0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_divisible_ui_p()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Assert that x is divisible by 5.
|
|
Assert.IsTrue(gmp_lib.mpz_divisible_ui_p(x, 5U) > 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_divisible_2exp_p()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
Assert.IsTrue(gmp_lib.mpz_divisible_2exp_p(x, 2U) > 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_even()
|
|
{
|
|
// Create, initialize, and set the value of op to 427295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 427295);
|
|
|
|
// Assert that op is not even but odd.
|
|
Assert.IsTrue(gmp_lib.mpz_even_p(op) == 0);
|
|
Assert.IsTrue(gmp_lib.mpz_odd_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_export()
|
|
{
|
|
// Create, initialize, and set the value of op to 0x800000000000000000000001.
|
|
mpz_t op = new mpz_t();
|
|
char_ptr value = new char_ptr("800000000000000000000001");
|
|
gmp_lib.mpz_init_set_str(op, value, 16);
|
|
|
|
// Export op as 3 words of 4 bytes each, first word is lsb, and first byte in each word is msb.
|
|
void_ptr data = gmp_lib.allocate(12);
|
|
size_t countp = 0;
|
|
gmp_lib.mpz_export(data, ref countp, -1, 4, 1, 0, op);
|
|
|
|
// Assert the result.
|
|
byte[] result = new byte[12];
|
|
Marshal.Copy(data.ToIntPtr(), result, 0, 12);
|
|
Assert.IsTrue(result[0] == 0x00);
|
|
Assert.IsTrue(result[1] == 0x00);
|
|
Assert.IsTrue(result[2] == 0x00);
|
|
Assert.IsTrue(result[3] == 0x01);
|
|
Assert.IsTrue(result[4] == 0x00);
|
|
Assert.IsTrue(result[5] == 0x00);
|
|
Assert.IsTrue(result[6] == 0x00);
|
|
Assert.IsTrue(result[7] == 0x00);
|
|
Assert.IsTrue(result[8] == 0x80);
|
|
Assert.IsTrue(result[9] == 0x00);
|
|
Assert.IsTrue(result[10] == 0x00);
|
|
Assert.IsTrue(result[11] == 0x00);
|
|
|
|
// Release unmanaged memory allocated for rop, data, and value.
|
|
gmp_lib.mpz_clear(op);
|
|
gmp_lib.free(data);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fac_ui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = 3!.
|
|
gmp_lib.mpz_fac_ui(rop, 3U);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_2fac_ui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = 9!!.
|
|
gmp_lib.mpz_2fac_ui(rop, 9U);
|
|
|
|
// Assert that rop is 945.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 945);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mfac_uiui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = 10!^(4).
|
|
gmp_lib.mpz_mfac_uiui(rop, 10U, 4U);
|
|
|
|
// Assert that rop is 945.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 120);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_primorial_ui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = 7 * 5 * 3 * 2 = 210.
|
|
gmp_lib.mpz_primorial_ui(rop, 9U);
|
|
|
|
// Assert that rop is 210.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 210);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_q()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = floor(n / d).
|
|
gmp_lib.mpz_fdiv_q(q, n, d);
|
|
|
|
// Assert that q is floor(10000 / 3).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
|
|
// Release unmanaged memory allocated for n, d, and q.
|
|
gmp_lib.mpz_clears(n, d, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_q_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = floor(n / 2^2).
|
|
gmp_lib.mpz_fdiv_q_2exp(q, n, 2U);
|
|
|
|
// Assert that q is floor(10001 / 4).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 2500);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_q_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = floor(n / 3) and return r = n - 3 * q.
|
|
// Assert q and r values.
|
|
Assert.IsTrue(gmp_lib.mpz_fdiv_q_ui(q, n, 3U) == 1U);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_qr()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = floor(n / 3) and r = n - d * q.
|
|
gmp_lib.mpz_fdiv_qr(q, r, n, d);
|
|
|
|
// Assert that q is 3333, and that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, d, q, and r.
|
|
gmp_lib.mpz_clears(n, d, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_qr_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = floor(n / 3), r = n - d * q, and return r.
|
|
Assert.IsTrue(gmp_lib.mpz_fdiv_qr_ui(q, r, n, 3U) == 1U);
|
|
|
|
// Assert that q is 3333, and that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, q, and r.
|
|
gmp_lib.mpz_clears(n, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_r()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - d * floor(n / d).
|
|
gmp_lib.mpz_fdiv_r(r, n, d);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, d, and r.
|
|
gmp_lib.mpz_clears(n, d, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_r_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 2^2 * floor(n / 2^2)
|
|
gmp_lib.mpz_fdiv_r_2exp(r, n, 2U);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_r_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 3 * floor(n / 3), and return |r|.
|
|
Assert.IsTrue(gmp_lib.mpz_fdiv_r_ui(r, n, 3U) == 1U);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fdiv_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Assert that returned value is |n - 3 * floor(n / 3)|.
|
|
Assert.IsTrue(gmp_lib.mpz_fdiv_ui(n, 3U) == 1U);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fib_ui()
|
|
{
|
|
// Create, initialize, and set the value of fn to 0.
|
|
mpz_t fn = new mpz_t();
|
|
gmp_lib.mpz_init(fn);
|
|
|
|
// Set fn to the n'th Fibonacci number.
|
|
gmp_lib.mpz_fib_ui(fn, 20U);
|
|
|
|
// Assert that fn is 6765.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(fn) == 6765);
|
|
|
|
// Release unmanaged memory allocated for fn.
|
|
gmp_lib.mpz_clear(fn);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fib2_ui()
|
|
{
|
|
// Create, initialize, and set the values of fn and fnsub1 to 0.
|
|
mpz_t fn = new mpz_t();
|
|
mpz_t fnsub1 = new mpz_t();
|
|
gmp_lib.mpz_inits(fn, fnsub1, null);
|
|
|
|
// Set fnsub1 and fn to the 19'th and 20'th Fibonacci numbers respectively.
|
|
gmp_lib.mpz_fib2_ui(fn, fnsub1, 20U);
|
|
|
|
// Assert that fnsub1 and fn are respectively 4181 and 6765.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(fnsub1) == 4181);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(fn) == 6765);
|
|
|
|
// Release unmanaged memory allocated for fn and fnsub1.
|
|
gmp_lib.mpz_clears(fn, fnsub1, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_sint_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in int.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_sint_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_slong_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in long.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_slong_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_sshort_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in short.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_sshort_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_uint_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in uint.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_uint_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_ulong_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op fits in ulong.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_ulong_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_fits_ushort_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in ushort.
|
|
Assert.IsTrue(gmp_lib.mpz_fits_ushort_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_gcd()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the greatest common divisor of op1 and op2.
|
|
gmp_lib.mpz_gcd(rop, op1, op2);
|
|
|
|
// Assert that rop is 7.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 7);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_gcd_ui()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Return the greatest common divisor of op1 and 70.
|
|
Assert.IsTrue(gmp_lib.mpz_gcd_ui(null, op1, 70U) == 7);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpz_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_gcdext()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t b = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(b, 70U);
|
|
|
|
// Create, initialize, and set the values of g, s, and t to 0.
|
|
mpz_t g = new mpz_t();
|
|
mpz_t s = new mpz_t();
|
|
mpz_t t = new mpz_t();
|
|
gmp_lib.mpz_inits(g, s, t, null);
|
|
|
|
// Set g to the the greatest common divisor of a and b, and set s and t such that a * s + b * t = g.
|
|
gmp_lib.mpz_gcdext(g, s, t, a, b);
|
|
|
|
// Assert that g is 7, and that s and t are respectively -1 and 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(g) == 7);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(s) == -1);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(t) == 1);
|
|
|
|
// Release unmanaged memory allocated for g, s, t, a, and b.
|
|
gmp_lib.mpz_clears(g, s, t, a, b, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_get_d()
|
|
{
|
|
// Create, initialize, and set the value of x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_d(x, 10.7D);
|
|
|
|
// Assert that the value of x is 10.0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_d(x) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_get_d_2exp()
|
|
{
|
|
// Create, initialize, and set the value of x to 2^20.
|
|
mpz_t x = new mpz_t();
|
|
char_ptr value = new char_ptr("100000000000000000000");
|
|
gmp_lib.mpz_init_set_str(x, value, 2);
|
|
|
|
// Assert that x is equal to 0.5^21.
|
|
int exp = 0;
|
|
Assert.IsTrue(gmp_lib.mpz_get_d_2exp(ref exp, x) == 0.5D);
|
|
Assert.IsTrue(exp == 21);
|
|
|
|
// Release unmanaged memory allocated for x and the string value.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_get_si()
|
|
{
|
|
// Create, initialize, and set the value of x to -10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10);
|
|
|
|
// Retrieve the value of x, and assert that it is -10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == -10);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_get_str()
|
|
{
|
|
// Create, initialize, and set the value of x to -210.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -210);
|
|
|
|
// Retrieve the string value of x, and assert that it is "-210".
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == "-210");
|
|
|
|
// Release unmanaged memory allocated for x and the string value.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_get_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10U);
|
|
|
|
// Retrieve the value of x, and assert that it is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(x) == 10U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_getlimbn()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t op = new mpz_t();
|
|
char_ptr value = new char_ptr("1000 ABCD 1234 7AB8 24FD");
|
|
gmp_lib.mpz_init_set_str(op, value, 16);
|
|
|
|
// Assert the value of the limbs of op.
|
|
if (gmp_lib.mp_bytes_per_limb == 4)
|
|
{
|
|
Assert.IsTrue(gmp_lib.mpz_getlimbn(op, 0) == 0x7AB824FD);
|
|
Assert.IsTrue(gmp_lib.mpz_getlimbn(op, 1) == 0xABCD1234);
|
|
Assert.IsTrue(gmp_lib.mpz_getlimbn(op, 2) == 0x00001000);
|
|
}
|
|
else // gmp_lib.mp_bytes_per_limb == 8
|
|
{
|
|
Assert.IsTrue(gmp_lib.mpz_getlimbn(op, 0) == 0xABCD12347AB824FD);
|
|
Assert.IsTrue(gmp_lib.mpz_getlimbn(op, 1) == 0x0000000000001000);
|
|
}
|
|
|
|
// Release unmanaged memory allocated for op and value.
|
|
gmp_lib.mpz_clear(op);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_hamdist()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Assert that the Hamming distance between op1 and op2 is 5.
|
|
Assert.IsTrue(gmp_lib.mpz_hamdist(op1, op2) == 5U);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpz_clears(op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_import()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Copy 0x800000000000000000000001, 3 words of 4 bytes each, first word is lsb, and first byte in each word is msb.
|
|
void_ptr data = gmp_lib.allocate(12);
|
|
Marshal.Copy(new byte[] { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 }, 0, data.ToIntPtr(), 12);
|
|
|
|
// Import value into rop.
|
|
gmp_lib.mpz_import(rop, 3, -1, 4, 1, 0, data);
|
|
|
|
// Assert the value of rop.
|
|
char_ptr value = gmp_lib.mpz_get_str(char_ptr.Zero, 16, rop);
|
|
Assert.IsTrue(value.ToString() == "800000000000000000000001");
|
|
|
|
// Release unmanaged memory allocated for rop, data, and value.
|
|
gmp_lib.mpz_clear(rop);
|
|
gmp_lib.free(data);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Assert that the value of x is 0.
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == "0");
|
|
|
|
// Release unmanaged memory allocated for x and its string value.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init2()
|
|
{
|
|
// Create a new integer x, and initialize its size to 300 bits.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init2(x, 300);
|
|
|
|
// Assert that the value of x is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_inits()
|
|
{
|
|
// Create new integers x1, x2 and x3.
|
|
mpz_t x1 = new mpz_t();
|
|
mpz_t x2 = new mpz_t();
|
|
mpz_t x3 = new mpz_t();
|
|
|
|
// Initialize the integers.
|
|
gmp_lib.mpz_inits(x1, x2, x3, null);
|
|
|
|
// Assert that their value is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x1) == 0);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x2) == 0);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x3) == 0);
|
|
|
|
// Release unmanaged memory allocated for the integers.
|
|
gmp_lib.mpz_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init_set()
|
|
{
|
|
// Create, initialize, and set a new integer y to -210.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init(y);
|
|
gmp_lib.mpz_set_si(y, -210);
|
|
|
|
// Create, initialize, and set a new integer x to the value of y.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set(x, y);
|
|
|
|
// Assert that x is equal to the value of y.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == -210);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init_set_d()
|
|
{
|
|
// Create, initialize, and set the value of x to the truncation of 10.7.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_d(x, 10.7D);
|
|
|
|
// Assert that the value of x is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 10);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init_set_si()
|
|
{
|
|
// Create, initialize, and set the value of x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, 10);
|
|
|
|
// Assert that the value of x is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 10);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init_set_str()
|
|
{
|
|
// Create, initialize, and set the value of x.
|
|
mpz_t x = new mpz_t();
|
|
char_ptr value = new char_ptr(" 1 234 567 890 876 543 211 234 567 890 987 654 321 ");
|
|
gmp_lib.mpz_init_set_str(x, value, 10);
|
|
|
|
// Assert the value of x.
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == value.ToString().Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and string values.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_init_set_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10U);
|
|
|
|
// Assert that the value of x is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(x) == 10U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_inp_raw()
|
|
{
|
|
// Create, initialize, and set the value of op to 123456.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 123456U);
|
|
|
|
// Write op to a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
Assert.IsTrue(gmp_lib.mpz_out_raw(stream, op) == 7);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Read op from the temporary file, and assert that the number of bytes read is 6.
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.mpz_inp_raw(op, stream) == 7);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that op is 123456.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(op) == 123456U);
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_inp_str()
|
|
{
|
|
// Create and initialize op.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init(op);
|
|
|
|
// Write op to a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
System.IO.File.WriteAllText(pathname, "123456");
|
|
|
|
// Read op from the temporary file, and assert that the number of bytes read is 6.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.mpz_inp_str(op, stream, 10) == 6);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that op is 123456.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(op) == 123456U);
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_invert()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 3.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 3U);
|
|
|
|
// Create, initialize, and set the value of op2 to 11.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 11U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the modular inverse of op1 mod op2, i.e. b, where op1 * b mod op1 = 1.
|
|
gmp_lib.mpz_invert(rop, op1, op2);
|
|
|
|
// Assert that rop is 4,
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 4);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_ior()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the bitwise inclusive or of op1 and op2.
|
|
gmp_lib.mpz_ior(rop, op1, op2);
|
|
|
|
// Assert that rop is 127.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 127);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_jacobi()
|
|
{
|
|
// Create, initialize, and set the value of a to 11.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 11U);
|
|
|
|
// Create, initialize, and set the value of b to 9.
|
|
mpz_t b = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(b, 9U);
|
|
|
|
// Assert that the Jacobi symbol of (a/b) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_jacobi(a, b) == 1);
|
|
|
|
// Release unmanaged memory allocated for a and b.
|
|
gmp_lib.mpz_clears(a, b, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_kronecker()
|
|
{
|
|
// Create, initialize, and set the value of a to 15.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 15U);
|
|
|
|
// Create, initialize, and set the value of b to 4.
|
|
mpz_t b = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(b, 4U);
|
|
|
|
// Assert that the Kronecker symbol of (a/b) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_kronecker(a, b) == 1);
|
|
|
|
// Release unmanaged memory allocated for a and b.
|
|
gmp_lib.mpz_clears(a, b, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_kronecker_si()
|
|
{
|
|
// Create, initialize, and set the value of a to 15.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 15U);
|
|
|
|
// Assert that the Kronecker symbol of (a/4) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_kronecker_si(a, 4) == 1);
|
|
|
|
// Release unmanaged memory allocated for a.
|
|
gmp_lib.mpz_clear(a);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_kronecker_ui()
|
|
{
|
|
// Create, initialize, and set the value of a to 15.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 15U);
|
|
|
|
// Assert that the Kronecker symbol of (a/4) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_kronecker_ui(a, 4U) == 1);
|
|
|
|
// Release unmanaged memory allocated for a.
|
|
gmp_lib.mpz_clear(a);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_si_kronecker()
|
|
{
|
|
// Create, initialize, and set the value of b to 4.
|
|
mpz_t b = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(b, 4U);
|
|
|
|
// Assert that the Kronecker symbol of (15/b) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_si_kronecker(15, b) == 1);
|
|
|
|
// Release unmanaged memory allocated for b.
|
|
gmp_lib.mpz_clear(b);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_ui_kronecker()
|
|
{
|
|
// Create, initialize, and set the value of b to 4.
|
|
mpz_t b = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(b, 4U);
|
|
|
|
// Assert that the Kronecker symbol of (15/b) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_ui_kronecker(15U, b) == 1);
|
|
|
|
// Release unmanaged memory allocated for b.
|
|
gmp_lib.mpz_clear(b);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_lcm()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 2.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 2U);
|
|
|
|
// Create, initialize, and set the value of op2 to 3.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the least common multiple of op1 and op2.
|
|
gmp_lib.mpz_lcm(rop, op1, op2);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_lcm_ui()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 2.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 2U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the least common multiple of op1 and 3.
|
|
gmp_lib.mpz_lcm_ui(rop, op1, 3U);
|
|
|
|
// Assert that rop is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 6);
|
|
|
|
// Release unmanaged memory allocated for rop and op1.
|
|
gmp_lib.mpz_clears(rop, op1, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_legendre()
|
|
{
|
|
// Create, initialize, and set the value of a to 20.
|
|
mpz_t a = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(a, 20U);
|
|
|
|
// Create, initialize, and set the value of p to 11.
|
|
mpz_t p = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(p, 11U);
|
|
|
|
// Assert that the Legendre symbol of (a/p) is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_legendre(a, p) == 1);
|
|
|
|
// Release unmanaged memory allocated for a and p.
|
|
gmp_lib.mpz_clears(a, p, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_lucnum_ui()
|
|
{
|
|
// Create, initialize, and set the value of ln to 0.
|
|
mpz_t ln = new mpz_t();
|
|
gmp_lib.mpz_init(ln);
|
|
|
|
// Set ln to the 9'th Lucas number.
|
|
gmp_lib.mpz_lucnum_ui(ln, 9U);
|
|
|
|
// Assert that ln is 76.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(ln) == 76);
|
|
|
|
// Release unmanaged memory allocated for ln.
|
|
gmp_lib.mpz_clear(ln);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_lucnum2_ui()
|
|
{
|
|
// Create, initialize, and set the values of lnsub1 and ln to 0.
|
|
mpz_t ln = new mpz_t();
|
|
mpz_t lnsub1 = new mpz_t();
|
|
gmp_lib.mpz_inits(ln, lnsub1, null);
|
|
|
|
// Set lnsub1 and ln to the 8'th and 9'th Lucas nunbers respectively.
|
|
gmp_lib.mpz_lucnum2_ui(ln, lnsub1, 9U);
|
|
|
|
// Assert that lnsub1 and ln are respectively 47 and 76.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(lnsub1) == 47);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(ln) == 76);
|
|
|
|
// Release unmanaged memory allocated for ln and lnsub1.
|
|
gmp_lib.mpz_clears(ln, lnsub1, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_millerrabin()
|
|
{
|
|
// Create, initialize, and set the value of n to 12.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(n, 12U);
|
|
|
|
// Assert that n is a composite number.
|
|
Assert.IsTrue(gmp_lib.mpz_millerrabin(n, 25) == 0);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mod()
|
|
{
|
|
// Create, initialize, and set the value of x to 12222.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 12222U);
|
|
|
|
// Create, initialize, and set the value of y to 10000.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 10000U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x mod y.
|
|
gmp_lib.mpz_mod(z, x, y);
|
|
|
|
// Assert that z is 12222 mod 10000.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 12222 % 10000);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mod_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 12222.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x mod y, and return z.
|
|
Assert.IsTrue(gmp_lib.mpz_mod_ui(z, x, 10000U) == 12222 % 10000);
|
|
|
|
// Assert that z is 12222 mod 10000.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 12222 % 10000);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mul()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 12222.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x * y.
|
|
gmp_lib.mpz_mul(z, x, y);
|
|
|
|
// Assert that z is the product of x and y.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mul_2exp()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of x to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = -10000 * 2^2.
|
|
gmp_lib.mpz_mul_2exp(z, x, 2U);
|
|
|
|
// Assert that z is -40000.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == -10000 * 4);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mul_si()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x * 12222.
|
|
gmp_lib.mpz_mul_si(z, x, 12222);
|
|
|
|
// Assert that z is the product of x and 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == -10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_mul_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x * 12222.
|
|
gmp_lib.mpz_mul_ui(z, x, 12222);
|
|
|
|
// Assert that z is the product of x and 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == -10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_neg()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = -x.
|
|
gmp_lib.mpz_neg(z, x);
|
|
|
|
// Assert that z is -x.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 10000);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_nextprime()
|
|
{
|
|
// Create, initialize, and set the value of n to 12.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 12U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the next following op.
|
|
gmp_lib.mpz_nextprime(rop, op);
|
|
|
|
// Assert that rop is 13.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 13);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpz_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_odd()
|
|
{
|
|
// Create, initialize, and set the value of op to 427294.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 427294);
|
|
|
|
// Assert that op is not odd but even.
|
|
Assert.IsTrue(gmp_lib.mpz_even_p(op) > 0);
|
|
Assert.IsTrue(gmp_lib.mpz_odd_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_out_raw()
|
|
{
|
|
// Create, initialize, and set the value of op to 123456 (0x1E240).
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 0x1E240);
|
|
|
|
// Get a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
|
|
// Open temporary file for writing.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
|
|
// Write op to temporary file, and assert that the number of bytes written is 7.
|
|
Assert.IsTrue(gmp_lib.mpz_out_raw(stream, op) == 7);
|
|
|
|
// Close temporary file.
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that the content of the temporary file.
|
|
byte[] r = System.IO.File.ReadAllBytes(pathname);
|
|
Assert.IsTrue(r[0] == 0 && r[1] == 0 && r[2] == 0 && r[3] == 3 && r[4] == 0x01 && r[5] == 0xE2 && r[6] == 0x40);
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, SetLastError = true)]
|
|
public static extern Int32 _wfopen_s(out IntPtr pFile, String filename, String mode);
|
|
|
|
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
|
|
public static extern Int32 fclose(IntPtr stream);
|
|
|
|
[TestMethod]
|
|
public void mpz_out_str()
|
|
{
|
|
// Create, initialize, and set the value of op to 123456.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 123456U);
|
|
|
|
// Get a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
|
|
// Open temporary file for writing.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
|
|
// Write op to temporary file, and assert that the number of bytes written is 6.
|
|
Assert.IsTrue(gmp_lib.mpz_out_str(stream, 10, op) == 6);
|
|
|
|
// Close temporary file.
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that the content of the temporary file is "123456".
|
|
string result = System.IO.File.ReadAllText(pathname);
|
|
Assert.IsTrue(result == "123456");
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_perfect_power_p()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Assert that op is a perfect power.
|
|
Assert.IsTrue(gmp_lib.mpz_perfect_power_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_perfect_square_p()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Assert that op is a perfect square.
|
|
Assert.IsTrue(gmp_lib.mpz_perfect_square_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_popcount()
|
|
{
|
|
// Create, initialize, and set the value of op to 63.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 63U);
|
|
|
|
// Assert that op has 6 one bits.
|
|
Assert.IsTrue(gmp_lib.mpz_popcount(op) == 6U);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clears(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_pow_ui()
|
|
{
|
|
// Create, initialize, and set the value of base to 2.
|
|
mpz_t @base = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(@base, 2U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = base^4.
|
|
gmp_lib.mpz_pow_ui(rop, @base, 4U);
|
|
|
|
// Assert that rop is 16.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 16);
|
|
|
|
// Release unmanaged memory allocated for rop and base.
|
|
gmp_lib.mpz_clears(rop, @base, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_powm()
|
|
{
|
|
// Create, initialize, and set the value of base to 2.
|
|
mpz_t @base = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(@base, 2U);
|
|
|
|
// Create, initialize, and set the value of exp to 4.
|
|
mpz_t exp = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(exp, 4U);
|
|
|
|
// Create, initialize, and set the value of mod to 3.
|
|
mpz_t mod = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(mod, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = base^exp mod mod.
|
|
gmp_lib.mpz_powm(rop, @base, exp, mod);
|
|
|
|
// Assert that rop is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 1);
|
|
|
|
// Release unmanaged memory allocated for rop, base, exp, and mod.
|
|
gmp_lib.mpz_clears(rop, @base, exp, mod, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_powm_sec()
|
|
{
|
|
// Create, initialize, and set the value of base to 2.
|
|
mpz_t @base = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(@base, 2U);
|
|
|
|
// Create, initialize, and set the value of exp to 4.
|
|
mpz_t exp = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(exp, 4U);
|
|
|
|
// Create, initialize, and set the value of mod to 3.
|
|
mpz_t mod = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(mod, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = base^exp mod mod.
|
|
gmp_lib.mpz_powm_sec(rop, @base, exp, mod);
|
|
|
|
// Assert that rop is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 1);
|
|
|
|
// Release unmanaged memory allocated for rop, base, exp, and mod.
|
|
gmp_lib.mpz_clears(rop, @base, exp, mod, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_powm_ui()
|
|
{
|
|
// Create, initialize, and set the value of base to 2.
|
|
mpz_t @base = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(@base, 2U);
|
|
|
|
mpz_t mod = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(mod, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = base^4 mod mod.
|
|
gmp_lib.mpz_powm_ui(rop, @base, 4U, mod);
|
|
|
|
// Assert that rop is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 1);
|
|
|
|
// Release unmanaged memory allocated for rop, base, and mod.
|
|
gmp_lib.mpz_clears(rop, @base, mod, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_probab_prime_p()
|
|
{
|
|
// Create, initialize, and set the value of n to 12.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(n, 12U);
|
|
|
|
// Assert that n is a composite number.
|
|
Assert.IsTrue(gmp_lib.mpz_probab_prime_p(n, 25) == 0);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_random()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Generate a random integer.
|
|
gmp_lib.mpz_random(rop, 500);
|
|
|
|
// Free all memory occupied by state and rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_random2()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Generate a random integer.
|
|
gmp_lib.mpz_random(rop, 100);
|
|
|
|
// Free all memory occupied by rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_realloc2()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x to a 77-bit integer.
|
|
char_ptr value = new char_ptr("1000 0000 0000 0000 0000");
|
|
gmp_lib.mpz_set_str(x, value, 16);
|
|
|
|
// Resize x to 512 bits, and assert that its value has not changed.
|
|
gmp_lib.mpz_realloc2(x, 512U);
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 16, x);
|
|
Assert.IsTrue(s.ToString() == "1000 0000 0000 0000 0000".Replace(" ", ""));
|
|
|
|
// Resize x to 2 bits, and assert that its value has changed to 0.
|
|
gmp_lib.mpz_realloc2(x, 2U);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and string values.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_remove()
|
|
{
|
|
// Create, initialize, and set the value of op to 45.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 45U);
|
|
|
|
// Create, initialize, and set the value of f to 3.
|
|
mpz_t f = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(f, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = op / f^n, and return n, the largest integer greater than or equal to 0, such that f^n divides op.
|
|
Assert.IsTrue(gmp_lib.mpz_remove(rop, op, f) == 2);
|
|
|
|
// Assert that rop is 5.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 5);
|
|
|
|
// Release unmanaged memory allocated for rop, op, and f.
|
|
gmp_lib.mpz_clears(rop, op, f, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_root()
|
|
{
|
|
// Create, initialize, and set the value of op to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = trunc(cbrt(10000)).
|
|
gmp_lib.mpz_root(rop, op, 3U);
|
|
|
|
// Assert that rop is 21.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 21);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_rootrem()
|
|
{
|
|
// Create, initialize, and set the value of u to 10000.
|
|
mpz_t u = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(u, 10000);
|
|
|
|
// Create, initialize, and set the values of root and rem to 0.
|
|
mpz_t root = new mpz_t();
|
|
mpz_t rem = new mpz_t();
|
|
gmp_lib.mpz_inits(root, rem, null);
|
|
|
|
// Set root = trunc(cbrt(10000)) and rem = u - root.
|
|
gmp_lib.mpz_rootrem(root, rem, u, 3U);
|
|
|
|
// Assert that root is 21, and rem is 739.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(root) == 21);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rem) == 739);
|
|
|
|
// Release unmanaged memory allocated for root, rem, and u.
|
|
gmp_lib.mpz_clears(root, rem, u, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_rrandomb()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Generate a random integer in the range [2^(50-1), (2^50)-1].
|
|
gmp_lib.mpz_rrandomb(rop, state, 50);
|
|
|
|
// Free all memory occupied by state and rop.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_scan0()
|
|
{
|
|
// Create, initialize, and set the value of op to 70.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 70U);
|
|
|
|
// Assert that the first 0 bit starting from bit 1 in op is bit 3.
|
|
Assert.IsTrue(gmp_lib.mpz_scan0(op, 1U) == 3U);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_scan1()
|
|
{
|
|
// Create, initialize, and set the value of op to 70.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op, 70U);
|
|
|
|
// Assert that the first 1 bit starting from bit 3 in op is bit 6.
|
|
Assert.IsTrue(gmp_lib.mpz_scan1(op, 3U) == 6U);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set()
|
|
{
|
|
// Create, initialize, and set a new integer x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
gmp_lib.mpz_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new integer y to -210.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init(y);
|
|
gmp_lib.mpz_set_si(y, -210);
|
|
|
|
// Assign the value of y to x.
|
|
gmp_lib.mpz_set(x, y);
|
|
|
|
// Assert that the value of x is -210.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == -210);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_d()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x to the truncation of 10.7.
|
|
gmp_lib.mpz_set_d(x, 10.7D);
|
|
|
|
// Assert that the value of x is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 10);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_f()
|
|
{
|
|
// Create and initialize new integer x, and float y.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
mpf_t y = "1.7007e3";
|
|
|
|
// Set the value of x to the truncation of 1700.7.
|
|
gmp_lib.mpz_set_f(x, y);
|
|
|
|
// Assert that the value of x is 1700.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 1700);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.mpf_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_q()
|
|
{
|
|
// Create and initialize new integer x, and rational y.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
mpq_t y = "100/3";
|
|
|
|
// Set the value of x to the truncation of 100/3.
|
|
gmp_lib.mpz_set_q(x, y);
|
|
|
|
// Assert that the value of x is 33.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == 33);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.mpq_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_si()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x to -10.
|
|
gmp_lib.mpz_set_si(x, -10);
|
|
|
|
// Assert that the value of x is -10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == -10);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_str()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x.
|
|
char_ptr value = new char_ptr("12 345 678 909 876 543 211 234 567 890 987 654 321");
|
|
gmp_lib.mpz_set_str(x, value, 10);
|
|
|
|
// Assert the value of x.
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == value.ToString().Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and string values.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_set_ui()
|
|
{
|
|
// Create and initialize a new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x to 10.
|
|
gmp_lib.mpz_set_ui(x, 10U);
|
|
|
|
// Assert that the value of x is 10.
|
|
Assert.IsTrue(gmp_lib.mpz_get_ui(x) == 10U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpz_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_setbit()
|
|
{
|
|
// Create, initialize, and set the value of rop to 70.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(rop, 70);
|
|
|
|
// Set bit 3 of rop.
|
|
gmp_lib.mpz_setbit(rop, 3U);
|
|
|
|
// Assert that rop is 78.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 78);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sgn()
|
|
{
|
|
// Create, initialize, and set the value of op to -10.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, -10);
|
|
|
|
// Assert that the sign of op is -1.
|
|
Assert.IsTrue(gmp_lib.mpz_sgn(op) == -1);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_size()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t op = new mpz_t();
|
|
char_ptr value = new char_ptr("1000 ABCD 1234 7AB8 24FD");
|
|
gmp_lib.mpz_init_set_str(op, value, 16);
|
|
|
|
// Assert the value of the limbs of op.
|
|
if (gmp_lib.mp_bytes_per_limb == 4)
|
|
Assert.IsTrue(gmp_lib.mpz_size(op) == 3);
|
|
else // gmp_lib.mp_bytes_per_limb == 8
|
|
Assert.IsTrue(gmp_lib.mpz_size(op) == 2);
|
|
|
|
// Release unmanaged memory allocated for op and value.
|
|
gmp_lib.mpz_clear(op);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sizeinbase()
|
|
{
|
|
// Create, initialize, and set the value of op to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Assert size in different bases.
|
|
Assert.IsTrue(gmp_lib.mpz_sizeinbase(op, 2) == 14);
|
|
Assert.IsTrue(gmp_lib.mpz_sizeinbase(op, 8) == 5);
|
|
Assert.IsTrue(gmp_lib.mpz_sizeinbase(op, 10) == 5);
|
|
Assert.IsTrue(gmp_lib.mpz_sizeinbase(op, 16) == 4);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpz_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sqrt()
|
|
{
|
|
// Create, initialize, and set the value of op to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = trunc(sqrt(op)).
|
|
gmp_lib.mpz_sqrt(rop, op);
|
|
|
|
// Assert that rop is 100.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 100);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpz_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sqrtrem()
|
|
{
|
|
// Create, initialize, and set the value of op to 10000.
|
|
mpz_t op = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(op, 10000);
|
|
|
|
// Create, initialize, and set the values of root and rem to 0.
|
|
mpz_t root = new mpz_t();
|
|
mpz_t rem = new mpz_t();
|
|
gmp_lib.mpz_inits(root, rem);
|
|
|
|
// Set root = trunc(sqrt(op)), and rem = op - root.
|
|
gmp_lib.mpz_sqrtrem(root, rem, op);
|
|
|
|
// Assert that root is 100, and rem is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(root) == 100);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rem) == 0);
|
|
|
|
// Release unmanaged memory allocated for root, rem, and op.
|
|
gmp_lib.mpz_clears(root, rem, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sub()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 12222.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x - y.
|
|
gmp_lib.mpz_sub(z, x, y);
|
|
|
|
// Assert that z = x - y.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == -2222);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_sub_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = x - 12222.
|
|
gmp_lib.mpz_sub_ui(z, x, 12222U);
|
|
|
|
// Assert that z = x - 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == -2222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_ui_sub()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init(z);
|
|
|
|
// Set z = 12222 - x.
|
|
gmp_lib.mpz_ui_sub(z, 12222U, x);
|
|
|
|
// Assert that z = 12222 - x.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 2222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_submul()
|
|
{
|
|
// Create, initialize, and set the value of x to 10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 10000U);
|
|
|
|
// Create, initialize, and set the value of y to 12222.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(y, 12222U);
|
|
|
|
// Create, initialize, and set the value of z to 20000.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(z, 20000);
|
|
|
|
// Set z -= x * y.
|
|
gmp_lib.mpz_submul(z, x, y);
|
|
|
|
// Assert that z has been decremented by 10000 * 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 20000 - 10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpz_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_submul_ui()
|
|
{
|
|
// Create, initialize, and set the value of x to -10000.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, -10000);
|
|
|
|
// Create, initialize, and set the value of z to 20000.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(z, 20000);
|
|
|
|
// Set z -= x * 12222U.
|
|
gmp_lib.mpz_submul_ui(z, x, 12222U);
|
|
|
|
// Assert that z has been decremented by -10000 * 12222.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(z) == 20000 - -10000 * 12222);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpz_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_swap()
|
|
{
|
|
// Create, initialize, and set a new integer x to 10.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new integer x to -210.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(y, -210);
|
|
|
|
// Swap the values of x and y.
|
|
gmp_lib.mpz_swap(x, y);
|
|
|
|
// Assert that the values have been swapped.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(x) == -210);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(y) == 10);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpz_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_q()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = trunc(n / d).
|
|
gmp_lib.mpz_tdiv_q(q, n, d);
|
|
|
|
// Assert that q is trunc(10000 / 3).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
|
|
// Release unmanaged memory allocated for n, d, and q.
|
|
gmp_lib.mpz_clears(n, d, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_q_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = trunc(n / 2^2).
|
|
gmp_lib.mpz_tdiv_q_2exp(q, n, 2U);
|
|
|
|
// Assert that q is trunc(10001 / 4).
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 2500);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_q_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpz_t q = new mpz_t();
|
|
gmp_lib.mpz_init(q);
|
|
|
|
// Set q = trunc(n / 3) and return r = n - 3 * q.
|
|
// Assert q and r values.
|
|
Assert.IsTrue(gmp_lib.mpz_tdiv_q_ui(q, n, 3U) == 1U);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
|
|
// Release unmanaged memory allocated for n and q.
|
|
gmp_lib.mpz_clears(n, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_qr()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = trunc(n / 3) and r = n - d * q.
|
|
gmp_lib.mpz_tdiv_qr(q, r, n, d);
|
|
|
|
// Assert that q is 3333, and that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, d, q, and r.
|
|
gmp_lib.mpz_clears(n, d, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_qr_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the values of q and r to 0.
|
|
mpz_t q = new mpz_t();
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_inits(q, r, null);
|
|
|
|
// Set q = trunc(n / 3), r = n - d * q, and return r.
|
|
Assert.IsTrue(gmp_lib.mpz_tdiv_qr_ui(q, r, n, 3U) == 1U);
|
|
|
|
// Assert that q is 3333, and that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(q) == 3333);
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, q, and r.
|
|
gmp_lib.mpz_clears(n, q, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_r()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of d to 3.
|
|
mpz_t d = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(d, 3);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - d * trunc(n / d).
|
|
gmp_lib.mpz_tdiv_r(r, n, d);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n, d, and r.
|
|
gmp_lib.mpz_clears(n, d, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_r_2exp()
|
|
{
|
|
// Create, initialize, and set the value of n to 10001.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10001);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 2^2 * trunc(n / 2^2)
|
|
gmp_lib.mpz_tdiv_r_2exp(r, n, 2U);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_r_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Create, initialize, and set the value of r to 0.
|
|
mpz_t r = new mpz_t();
|
|
gmp_lib.mpz_init(r);
|
|
|
|
// Set r = n - 3 * trunc(n / 3), and return |r|.
|
|
Assert.IsTrue(gmp_lib.mpz_tdiv_r_ui(r, n, 3U) == 1U);
|
|
|
|
// Assert that r is 1.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(r) == 1);
|
|
|
|
// Release unmanaged memory allocated for n and r.
|
|
gmp_lib.mpz_clears(n, r, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tdiv_ui()
|
|
{
|
|
// Create, initialize, and set the value of n to 10000.
|
|
mpz_t n = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(n, 10000);
|
|
|
|
// Assert that returned value is |n - 3 * trunc(n / 3)|.
|
|
Assert.IsTrue(gmp_lib.mpz_tdiv_ui(n, 3U) == 1U);
|
|
|
|
// Release unmanaged memory allocated for n.
|
|
gmp_lib.mpz_clear(n);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_tstbit()
|
|
{
|
|
// Create, initialize, and set the value of rop to 70.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(rop, 70);
|
|
|
|
// Assert that bit 3 of rop is 0.
|
|
Assert.IsTrue(gmp_lib.mpz_tstbit(rop, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_ui_pow_ui()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop = 2^4.
|
|
gmp_lib.mpz_ui_pow_ui(rop, 2U, 4U);
|
|
|
|
// Assert that rop is 16.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 16);
|
|
|
|
// Release unmanaged memory allocated for rop.
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_urandomb()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Generate a random integer in the range [0, (2^50)-1].
|
|
gmp_lib.mpz_urandomb(rop, state, 50);
|
|
|
|
// Free all memory occupied by state and rop.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpz_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_urandomm()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Create, initialize, and set a large integer.
|
|
mpz_t n = new mpz_t();
|
|
char_ptr value = new char_ptr("123 456 789 012 345 678 901");
|
|
gmp_lib.mpz_init_set_str(n, value, 10);
|
|
|
|
// Generate a random integer in the range [0, n-1].
|
|
gmp_lib.mpz_urandomm(rop, state, n);
|
|
|
|
// Free all memory occupied by state, rop, and n.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpz_clears(rop, n, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_xor()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 63.
|
|
mpz_t op1 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op1, 63U);
|
|
|
|
// Create, initialize, and set the value of op2 to 70.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(op2, 70U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpz_t rop = new mpz_t();
|
|
gmp_lib.mpz_init(rop);
|
|
|
|
// Set rop to the bitwise exclusive or of op1 and op2.
|
|
gmp_lib.mpz_xor(rop, op1, op2);
|
|
|
|
// Assert that rop is 121.
|
|
Assert.IsTrue(gmp_lib.mpz_get_si(rop) == 121);
|
|
|
|
// Release unmanaged memory allocated for rop, op1, and op2.
|
|
gmp_lib.mpz_clears(rop, op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_limbs_read()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Set the value of x.
|
|
char_ptr value = new char_ptr("10000 00000000000000000000000000000000");
|
|
gmp_lib.mpz_set_str(x, value, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 4);
|
|
|
|
// Get pointer to the limbs of x.
|
|
mp_ptr limbs = gmp_lib.mpz_limbs_read(x);
|
|
|
|
// Assert the values of the limbs based on current architecture (x86 or x64).
|
|
Assert.IsTrue(limbs[0] == 0);
|
|
Assert.IsTrue(limbs[1] == (gmp_lib.mp_bytes_per_limb == 4 ? 16U : 256U));
|
|
|
|
// Release unmanaged memory allocated for x and value.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_limbs_write()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Resize x to 3 limbs, and get pointer to the limbs.
|
|
gmp_lib.mpz_set_ui(x, 2U);
|
|
mp_ptr limbs = gmp_lib.mpz_limbs_write(x, 3);
|
|
|
|
// Set the values of the limbs.
|
|
limbs[0] = 0U;
|
|
limbs[1] = 0U;
|
|
limbs[2] = (gmp_lib.mp_bytes_per_limb == 4 ? 2U : 4U);
|
|
gmp_lib.mpz_limbs_finish(x, -3);
|
|
|
|
// Assert the value of x based on current architecture (x86 or x64).
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 4, x);
|
|
Assert.IsTrue(s.ToString() == "-10 00000000000000000000000000000000 00000000000000000000000000000000".Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and s.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_limbs_modify()
|
|
{
|
|
// Create, initialize, and set the value of x to 2.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(x, 2U);
|
|
|
|
// Resize x to 3 limbs, and get pointer to the limbs.
|
|
mp_ptr limbs = gmp_lib.mpz_limbs_modify(x, 3);
|
|
|
|
// Set the value of x.
|
|
limbs[0] = 0;
|
|
limbs[1] = 0;
|
|
limbs[2] = (IntPtr.Size == 4 ? 8U : 64U);
|
|
gmp_lib.mpz_limbs_finish(x, -3);
|
|
|
|
// Assert the value of x based on current architecture (x86 or x64).
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 4, x);
|
|
Assert.IsTrue(s.ToString() == "-1000 00000000000000000000000000000000 00000000000000000000000000000000".Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and s.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpz_roinit_n()
|
|
{
|
|
// Create and initialize new integer x.
|
|
mpz_t x = new mpz_t();
|
|
gmp_lib.mpz_init(x);
|
|
|
|
// Prepare new limbs for x.
|
|
mp_ptr limbs;
|
|
if (gmp_lib.mp_bytes_per_limb == 4)
|
|
limbs = new mp_ptr(new uint[] { 0U, 0U, 2U });
|
|
else
|
|
limbs = new mp_ptr(new ulong[] { 0UL, 0UL, 4UL });
|
|
|
|
// Assign new limbs to x, and make x negative.
|
|
x = gmp_lib.mpz_roinit_n(x, limbs, -3);
|
|
|
|
// Assert new value of x.
|
|
char_ptr s = gmp_lib.mpz_get_str(char_ptr.Zero, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 4, x);
|
|
Assert.IsTrue(s.ToString() == "-10 00000000000000000000000000000000 00000000000000000000000000000000".Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and s.
|
|
gmp_lib.mpz_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Rational (i.e. Q) routines."
|
|
|
|
[TestMethod]
|
|
public void mpq_abs()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpq_t rop = new mpq_t();
|
|
gmp_lib.mpq_init(rop);
|
|
|
|
// Set rop = |-1/3|.
|
|
gmp_lib.mpq_abs(rop, op);
|
|
|
|
// Assert that rop is 1 / 3.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(rop, 1, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpq_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_add()
|
|
{
|
|
// Create, initialize, and set the value of x to 1 / 2.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of y to 1 / 3.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_si(y, 1, 3U);
|
|
|
|
// Create, initialize, and set the value of z to 0 / 1.
|
|
mpq_t z = new mpq_t();
|
|
gmp_lib.mpq_init(z);
|
|
|
|
// Set z = x + y.
|
|
gmp_lib.mpq_add(z, x, y);
|
|
|
|
// Assert that z is the sum of x and y.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(z, 5, 6U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpq_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_canonicalize()
|
|
{
|
|
// Create, initialize, and set a new rational to 10 / 20.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, 10, 20U);
|
|
|
|
// Reduce op to its canonical form.
|
|
gmp_lib.mpq_canonicalize(op);
|
|
|
|
// Assert that z is the sum of x and y.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, 1, 2U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_clear()
|
|
{
|
|
// Create and initialize a new rational x.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Assert that the value of x is 0.0.
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpq_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_clears()
|
|
{
|
|
// Create new rationals x1, x2 and x3.
|
|
mpq_t x1 = new mpq_t();
|
|
mpq_t x2 = new mpq_t();
|
|
mpq_t x3 = new mpq_t();
|
|
|
|
// Initialize the rationals.
|
|
gmp_lib.mpq_inits(x1, x2, x3, null);
|
|
|
|
// Assert that their value is 0.0.
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x1) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x2) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x3) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for the rationals.
|
|
gmp_lib.mpq_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_cmp()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 1 / 2.
|
|
mpq_t op1 = new mpq_t();
|
|
gmp_lib.mpq_init(op1);
|
|
gmp_lib.mpq_set_si(op1, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of op2 to 1 / 3.
|
|
mpq_t op2 = new mpq_t();
|
|
gmp_lib.mpq_init(op2);
|
|
gmp_lib.mpq_set_si(op2, 1, 3U);
|
|
|
|
// Assert that op1 > op2.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp(op1, op2) > 0);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpq_clears(op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_cmp_si()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 1 / 2.
|
|
mpq_t op1 = new mpq_t();
|
|
gmp_lib.mpq_init(op1);
|
|
gmp_lib.mpq_set_si(op1, 1, 2U);
|
|
|
|
// Assert that op1 < 5/6.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op1, 5, 6U) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpq_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_cmp_ui()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 1 / 2.
|
|
mpq_t op1 = new mpq_t();
|
|
gmp_lib.mpq_init(op1);
|
|
gmp_lib.mpq_set_si(op1, 1, 2U);
|
|
|
|
// Assert that op1 == 3/6.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_ui(op1, 3, 6U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op1.
|
|
gmp_lib.mpq_clear(op1);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_cmp_z()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 1 / 2.
|
|
mpq_t op1 = new mpq_t();
|
|
gmp_lib.mpq_init(op1);
|
|
gmp_lib.mpq_set_si(op1, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of op2 to 3.
|
|
mpz_t op2 = new mpz_t();
|
|
gmp_lib.mpz_init(op2);
|
|
gmp_lib.mpz_set_si(op2, 3);
|
|
|
|
// Assert that op1 < op2.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_z(op1, op2) < 0);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpq_clear(op1);
|
|
gmp_lib.mpz_clear(op2);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_denref()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Get reference to denominator, and increment it by 2.
|
|
mpz_t num = gmp_lib.mpq_denref(op);
|
|
gmp_lib.mpz_add_ui(num, num, 2U);
|
|
|
|
// Assert that op is -1 / 5.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, -1, 5U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_div()
|
|
{
|
|
// Create, initialize, and set the value of n to 1 / 2.
|
|
mpq_t n = new mpq_t();
|
|
gmp_lib.mpq_init(n);
|
|
gmp_lib.mpq_set_si(n, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of d to 1 / 3.
|
|
mpq_t d = new mpq_t();
|
|
gmp_lib.mpq_init(d);
|
|
gmp_lib.mpq_set_si(d, 1, 3U);
|
|
|
|
// Create, initialize, and set the value of q to 0.
|
|
mpq_t q = new mpq_t();
|
|
gmp_lib.mpq_init(q);
|
|
|
|
// Set q = n / d.
|
|
gmp_lib.mpq_div(q, n, d);
|
|
|
|
// Assert that q is 3 / 2.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(q, 3, 2U) == 0);
|
|
|
|
// Release unmanaged memory allocated for n, d, and q.
|
|
gmp_lib.mpq_clears(n, d, q, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_div_2exp()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpq_t rop = new mpq_t();
|
|
gmp_lib.mpq_init(rop);
|
|
|
|
// Set rop = (-1/3) / 2^3.
|
|
gmp_lib.mpq_div_2exp(rop, op, 3U);
|
|
|
|
// Assert that rop is -1 / 24.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(rop, -1, 24U) == 0);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpq_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_equal()
|
|
{
|
|
// Create, initialize, and set the value of op1 to 1 / 2.
|
|
mpq_t op1 = new mpq_t();
|
|
gmp_lib.mpq_init(op1);
|
|
gmp_lib.mpq_set_si(op1, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of op2 to 1 / 3.
|
|
mpq_t op2 = new mpq_t();
|
|
gmp_lib.mpq_init(op2);
|
|
gmp_lib.mpq_set_si(op2, 1, 3U);
|
|
|
|
// Assert that op1 != op2.
|
|
Assert.IsTrue(gmp_lib.mpq_equal(op1, op2) == 0);
|
|
|
|
// Release unmanaged memory allocated for op1 and op2.
|
|
gmp_lib.mpq_clears(op1, op2, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_get_num()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create and initialize a new integer.
|
|
mpz_t num = new mpz_t();
|
|
gmp_lib.mpz_init(num);
|
|
|
|
// Set integer to numerator of rational, and increment integer by 2.
|
|
gmp_lib.mpq_get_num(num, op);
|
|
gmp_lib.mpz_add_ui(num, num, 2U);
|
|
|
|
// Assert that num is 1, and op is -1 / 3.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp_si(num, 1) == 0);
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, -1, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op and num.
|
|
gmp_lib.mpq_clear(op);
|
|
gmp_lib.mpz_clear(num);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_get_den()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create and initialize a new integer.
|
|
mpz_t den = new mpz_t();
|
|
gmp_lib.mpz_init(den);
|
|
|
|
// Set integer to numerator of rational, and increment integer by 2..
|
|
gmp_lib.mpq_get_den(den, op);
|
|
gmp_lib.mpz_add_ui(den, den, 2U);
|
|
|
|
// Assert that num is 1, and op is -1 / 3.
|
|
Assert.IsTrue(gmp_lib.mpz_cmp_si(den, 5) == 0);
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, -1, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op and num.
|
|
gmp_lib.mpq_clear(op);
|
|
gmp_lib.mpz_clear(den);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_get_d()
|
|
{
|
|
// Create, initialize, and set the value of x to 10 / 11.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 10, 11U);
|
|
|
|
// Assert that the value of x is 10.0.
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x) == 10.0 / 11.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpq_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_get_str()
|
|
{
|
|
// Create, initialize, and set the value of x to -210 / 13.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, -210, 13U);
|
|
|
|
// Retrieve the string value of x, and assert that it is "-210/13".
|
|
char_ptr s = gmp_lib.mpq_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == "-210/13");
|
|
|
|
// Release unmanaged memory allocated for x and the string value.
|
|
gmp_lib.mpq_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_init()
|
|
{
|
|
// Create and initialize a new rational x.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Assert that the value of x is 0.
|
|
char_ptr s = gmp_lib.mpq_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == "0");
|
|
|
|
// Release unmanaged memory allocated for x and its string value.
|
|
gmp_lib.mpq_clear(x);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_inits()
|
|
{
|
|
// Create new rationals x1, x2 and x3.
|
|
mpq_t x1 = new mpq_t();
|
|
mpq_t x2 = new mpq_t();
|
|
mpq_t x3 = new mpq_t();
|
|
|
|
// Initialize the rationals.
|
|
gmp_lib.mpq_inits(x1, x2, x3);
|
|
|
|
// Assert that their value is 0.
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x1) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x2) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x3) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for the rationals.
|
|
gmp_lib.mpq_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_inp_str()
|
|
{
|
|
// Create, initialize, and set the value of op to 123/456.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
|
|
// Write rational to a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
System.IO.File.WriteAllText(pathname, "123/456");
|
|
|
|
// Read op from the temporary file, and assert that the number of bytes read is 7.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.mpq_inp_str(op, stream, 10) == 7);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that op is 123/456.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_ui(op, 123, 456U) == 0);
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_inv()
|
|
{
|
|
// Create, initialize, and set the value of number to -1 / 3.
|
|
mpq_t number = new mpq_t();
|
|
gmp_lib.mpq_init(number);
|
|
gmp_lib.mpq_set_si(number, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of inverted_number to 0.
|
|
mpq_t inverted_number = new mpq_t();
|
|
gmp_lib.mpq_init(inverted_number);
|
|
|
|
// Set inverted_number = 1/(-1/3).
|
|
gmp_lib.mpq_inv(inverted_number, number);
|
|
|
|
// Assert that inverted_number is -3 / 1.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(inverted_number, -3, 1U) == 0);
|
|
|
|
// Release unmanaged memory allocated for inverted_number and number.
|
|
gmp_lib.mpq_clears(inverted_number, number, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_mul()
|
|
{
|
|
// Create, initialize, and set the value of x to 1 / 2.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of y to -1 / 3.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_si(y, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpq_t z = new mpq_t();
|
|
gmp_lib.mpq_init(z);
|
|
|
|
// Set z = x * y.
|
|
gmp_lib.mpq_mul(z, x, y);
|
|
|
|
// Assert that z is the product of x and y.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(z, -1, 6U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpq_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_mul_2exp()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpq_t rop = new mpq_t();
|
|
gmp_lib.mpq_init(rop);
|
|
|
|
// Set rop = (-1/3) * 2^3.
|
|
gmp_lib.mpq_mul_2exp(rop, op, 3U);
|
|
|
|
// Assert that rop is -8 / 3.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(rop, -8, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for rop and op.
|
|
gmp_lib.mpq_clears(rop, op, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_neg()
|
|
{
|
|
// Create, initialize, and set the value of operand to -1 / 3.
|
|
mpq_t operand = new mpq_t();
|
|
gmp_lib.mpq_init(operand);
|
|
gmp_lib.mpq_set_si(operand, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of negated_operand to 0.
|
|
mpq_t negated_operand = new mpq_t();
|
|
gmp_lib.mpq_init(negated_operand);
|
|
|
|
// Set negated_operand = -(-1/3).
|
|
gmp_lib.mpq_neg(negated_operand, operand);
|
|
|
|
// Assert that negated_operand is -8 / 3.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(negated_operand, 1, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for negated_operand and operand.
|
|
gmp_lib.mpq_clears(negated_operand, operand, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_numref()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Get reference to numerator, and increment it by 2.
|
|
mpz_t num = gmp_lib.mpq_numref(op);
|
|
gmp_lib.mpz_add_ui(num, num, 2U);
|
|
|
|
// Assert that op is 1 / 3.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, 1, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_out_str()
|
|
{
|
|
// Create, initialize, and set the value of op to 123/456.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_ui(op, 123, 456U);
|
|
|
|
// Get a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
|
|
// Open temporary file for writing.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
|
|
// Write op to temporary file, and assert that the number of bytes written is 7.
|
|
Assert.IsTrue(gmp_lib.mpq_out_str(stream, 10, op) == 7);
|
|
|
|
// Close temporary file.
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that the content of the temporary file is "123/456".
|
|
string result = System.IO.File.ReadAllText(pathname);
|
|
Assert.IsTrue(result == "123/456");
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set()
|
|
{
|
|
// Create, initialize, and set a new rational x to 10 / 11.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 10, 11);
|
|
|
|
// Create, initialize, and set a new rational y to -210 / 13.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_si(y, -210, 13);
|
|
|
|
// Assign the value of y to x.
|
|
gmp_lib.mpq_set(x, y);
|
|
|
|
// Assert that the value of x is -210 / 13.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(x, -210, 13) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpq_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_d()
|
|
{
|
|
// Create and initialize a new rational.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Set the value of x to 10.0 / 11.0.
|
|
gmp_lib.mpq_set_d(x, 10.0D / 11.0);
|
|
|
|
// Assert that the value of x is 10.0 / 11.0.
|
|
Assert.IsTrue(gmp_lib.mpq_get_d(x) == 10.0D / 11.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpq_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_den()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of a new integer to 5.
|
|
mpz_t den = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(den, 5U);
|
|
|
|
// Set the denominator of op.
|
|
gmp_lib.mpq_set_den(op, den);
|
|
|
|
// Assert that op is -1 / 5.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, -1, 5U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op and num.
|
|
gmp_lib.mpq_clear(op);
|
|
gmp_lib.mpz_clear(den);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_f()
|
|
{
|
|
// Create, initialize, and set a new rational x to 10 / 11.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 10, 11);
|
|
|
|
// Create, initialize, and set a new float y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init(y);
|
|
gmp_lib.mpf_set_si(y, -210);
|
|
|
|
// Assign the value of y to x.
|
|
gmp_lib.mpq_set_f(x, y);
|
|
|
|
// Assert that the value of x is -210 / 1.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(x, -210, 1) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpq_clear(x);
|
|
gmp_lib.mpf_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_num()
|
|
{
|
|
// Create, initialize, and set the value of op to -1 / 3.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -1, 3U);
|
|
|
|
// Create, initialize, and set the value of a new integer to 5.
|
|
mpz_t num = new mpz_t();
|
|
gmp_lib.mpz_init_set_ui(num, 5U);
|
|
|
|
// Set the numerator of op.
|
|
gmp_lib.mpq_set_num(op, num);
|
|
|
|
// Assert that op is 5 / 3.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(op, 5, 3U) == 0);
|
|
|
|
// Release unmanaged memory allocated for op and num.
|
|
gmp_lib.mpq_clear(op);
|
|
gmp_lib.mpz_clear(num);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_si()
|
|
{
|
|
// Create and initialize a new rational x.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Set the value of x to -10 / 11.
|
|
gmp_lib.mpq_set_si(x, -10, 11);
|
|
|
|
// Assert that the value of x is -10 / 1.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(x, -10, 11U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpq_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_str()
|
|
{
|
|
// Create and initialize a new rational x.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Set the value of x.
|
|
char_ptr value = new char_ptr("12 345 678 909 876 543 211 234 567 890 987 654 321 / 234 567 890");
|
|
gmp_lib.mpq_set_str(x, value, 10);
|
|
|
|
// Assert the value of x.
|
|
char_ptr s = gmp_lib.mpq_get_str(char_ptr.Zero, 10, x);
|
|
Assert.IsTrue(s.ToString() == value.ToString().Replace(" ", ""));
|
|
|
|
// Release unmanaged memory allocated for x and string values.
|
|
gmp_lib.mpq_clear(x);
|
|
gmp_lib.free(value);
|
|
gmp_lib.free(s);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_ui()
|
|
{
|
|
// Create and initialize a new rational x.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
|
|
// Set the value of x to 10 / 11.
|
|
gmp_lib.mpq_set_ui(x, 10U, 11U);
|
|
|
|
// Assert that the value of x is 10 / 11.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_ui(x, 10U, 11U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpq_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_set_z()
|
|
{
|
|
// Create, initialize, and set a new rational x to 10 / 11.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 10, 11);
|
|
|
|
// Create, initialize, and set a new integer y to -210.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init(y);
|
|
gmp_lib.mpz_set_si(y, -210);
|
|
|
|
// Assign the value of y to x.
|
|
gmp_lib.mpq_set_z(x, y);
|
|
|
|
// Assert that the value of x is -210 / 1.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(x, -210, 1) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpq_clear(x);
|
|
gmp_lib.mpz_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_sgn()
|
|
{
|
|
// Create, initialize, and set a new rational x to -10 / 11.
|
|
mpq_t op = new mpq_t();
|
|
gmp_lib.mpq_init(op);
|
|
gmp_lib.mpq_set_si(op, -10, 11);
|
|
|
|
// Assert that op is negative.
|
|
Assert.IsTrue(gmp_lib.mpq_sgn(op) == -1);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpq_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_sub()
|
|
{
|
|
// Create, initialize, and set the value of x to 1 / 2.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 1, 2U);
|
|
|
|
// Create, initialize, and set the value of y to 1 / 3.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_si(y, 1, 3U);
|
|
|
|
// Create, initialize, and set the value of z to 0.
|
|
mpq_t z = new mpq_t();
|
|
gmp_lib.mpq_init(z);
|
|
|
|
// Set z = x - y.
|
|
gmp_lib.mpq_sub(z, x, y);
|
|
|
|
// Assert that z = x - y.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(z, 1, 6U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpq_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpq_swap()
|
|
{
|
|
// Create, initialize, and set a new rational x to 10 / 11.
|
|
mpq_t x = new mpq_t();
|
|
gmp_lib.mpq_init(x);
|
|
gmp_lib.mpq_set_si(x, 10, 11U);
|
|
|
|
// Create, initialize, and set a new rational x to -210 / 13.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_si(y, -210, 13U);
|
|
|
|
// Swap the values of x and y.
|
|
gmp_lib.mpq_swap(x, y);
|
|
|
|
// Assert that the values have been swapped.
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(x, -210, 13U) == 0);
|
|
Assert.IsTrue(gmp_lib.mpq_cmp_si(y, 10, 11U) == 0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpq_clears(x, y, null);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Float (i.e. F) routines."
|
|
|
|
[TestMethod]
|
|
public void mpf_abs()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to -10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, -10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = |x|.
|
|
gmp_lib.mpf_neg(z, x);
|
|
|
|
// Assert that the value of z is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_add()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x + y.
|
|
gmp_lib.mpf_add(z, x, y);
|
|
|
|
// Assert that the value of z is -200.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -200.0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpf_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_add_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x + 210.
|
|
gmp_lib.mpf_add_ui(z, x, 210U);
|
|
|
|
// Assert that the value of z is 220.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 220.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_ceil()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.4.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, 10.4);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = ceil(x).
|
|
gmp_lib.mpf_ceil(z, x);
|
|
|
|
// Assert that the value of z is 11.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 11.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_clear()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create and initialize a new floating-point number x.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
|
|
// Assert that the value of x is 0.0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_clears()
|
|
{
|
|
// Create new floating-point numbers x1, x2 and x3.
|
|
mpf_t x1 = new mpf_t();
|
|
mpf_t x2 = new mpf_t();
|
|
mpf_t x3 = new mpf_t();
|
|
|
|
// Initialize the floating-point numbers.
|
|
gmp_lib.mpf_inits(x1, x2, x3, null);
|
|
|
|
// Assert that their value is 0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x1) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x2) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x3) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for the floating-point numbers.
|
|
gmp_lib.mpf_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_cmp()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(z, 128);
|
|
|
|
// Assert that x > z.
|
|
Assert.IsTrue(gmp_lib.mpf_cmp(x, z) > 0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_cmp_z()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpz_t z = new mpz_t();
|
|
gmp_lib.mpz_init_set_si(z, 128);
|
|
|
|
// Assert that x > z.
|
|
Assert.IsTrue(gmp_lib.mpf_cmp_z(x, z) > 0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.mpz_clear(z);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_cmp_d()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Assert that x > 128.0.
|
|
Assert.IsTrue(gmp_lib.mpf_cmp_d(x, 128.0) > 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_cmp_si()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Assert that x > 128.
|
|
Assert.IsTrue(gmp_lib.mpf_cmp_si(x, 128) > 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_cmp_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Assert that x > 128.
|
|
Assert.IsTrue(gmp_lib.mpf_cmp_ui(x, 128) > 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_div()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = y / x.
|
|
gmp_lib.mpf_div(z, y, x);
|
|
|
|
// Assert that the value of z is -21.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -21.0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpf_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_div_2exp()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 512.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 512);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x / 2^8.
|
|
gmp_lib.mpf_div_2exp(z, x, 8U);
|
|
|
|
// Assert that the value of z is 2.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 2.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_div_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = y / 10.
|
|
gmp_lib.mpf_div_ui(z, y, 10U);
|
|
|
|
// Assert that the value of z is -21.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -21.0);
|
|
|
|
// Release unmanaged memory allocated for y and z.
|
|
gmp_lib.mpf_clears(y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_sint_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in int.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_sint_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_slong_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in long.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_slong_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_sshort_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in short.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_sshort_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_uint_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in uint.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_uint_p(op) > 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_ulong_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in int.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_sint_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_fits_ushort_p()
|
|
{
|
|
// Create, initialize, and set the value of op 4294967295.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, uint.MaxValue);
|
|
|
|
// Assert that op does not fit in ushort.
|
|
Assert.IsTrue(gmp_lib.mpf_fits_ushort_p(op) == 0);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_floor()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.4.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, 10.4);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = floor(x).
|
|
gmp_lib.mpf_floor(z, x);
|
|
|
|
// Assert that the value of z is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_d()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to -123.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, -123.0);
|
|
|
|
// Assert that the value of x is -123.0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -123.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_d_2exp()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to -8.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, -8.0);
|
|
|
|
// Assert that the absolute value of x is 0.5 x 2^4.
|
|
ptr<int> exp = new ptr<int>(0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_d_2exp(exp, x) == 0.5);
|
|
Assert.IsTrue(exp.Value == 4);
|
|
|
|
// Release unmanaged memory allocated for x and exp.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_default_prec()
|
|
{
|
|
// Set default precision to 128 bits.
|
|
gmp_lib.mpf_set_default_prec(128U);
|
|
|
|
// Assert that the value of x is 128 bits.
|
|
Assert.IsTrue(gmp_lib.mpf_get_default_prec() == 128U);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_prec()
|
|
{
|
|
// Create and initialize a new floating-point number x with 64-bit precision.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 64U);
|
|
|
|
// Assert that the value of x is 0.0, and that its precision is 64 bits.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_prec(x) == 64U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_si()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to -8.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, -8.0);
|
|
|
|
// Assert that the value of x is -8.
|
|
Assert.IsTrue(gmp_lib.mpf_get_si(x) == -8);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_str()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to -8.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, -8.0);
|
|
|
|
// Assert that the value of x is -8.
|
|
ptr<mp_exp_t> exp = new ptr<mp_exp_t>(0);
|
|
char_ptr value = gmp_lib.mpf_get_str(char_ptr.Zero, exp, 10, 0, x);
|
|
Assert.IsTrue(value.ToString() == "-8");
|
|
Assert.IsTrue(exp.Value == 1);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_get_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to 8.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, 8.0);
|
|
|
|
// Assert that the value of x is -8.
|
|
Assert.IsTrue(gmp_lib.mpf_get_ui(x) == 8);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create and initialize a new floating-point number x.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
|
|
// Assert that the value of x is 0.0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init2()
|
|
{
|
|
// Create and initialize a new floating-point number x with 64-bit precision.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 64U);
|
|
|
|
// Assert that the value of x is 0.0, and that its precision is 64 bits.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 0.0);
|
|
uint p = gmp_lib.mpf_get_prec(x);
|
|
Assert.IsTrue(gmp_lib.mpf_get_prec(x) == 64U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_inits()
|
|
{
|
|
// Create new floating-point numbers x1, x2 and x3.
|
|
mpf_t x1 = new mpf_t();
|
|
mpf_t x2 = new mpf_t();
|
|
mpf_t x3 = new mpf_t();
|
|
|
|
// Initialize the floating-point numbers.
|
|
gmp_lib.mpf_inits(x1, x2, x3, null);
|
|
|
|
// Assert that their value is 0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x1) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x2) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x3) == 0.0);
|
|
|
|
// Release unmanaged memory allocated for the floating-point numbers.
|
|
gmp_lib.mpf_clears(x1, x2, x3, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init_set()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to x.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set(y, x);
|
|
|
|
// Assert that the value of y is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(y) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init_set_d()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to -123.0
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, -123.0);
|
|
|
|
// Assert that the value of x is -123.0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -123.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init_set_si()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize and set a new floating-point number to -123.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, -123);
|
|
|
|
// Assert that the value of x is -123.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -123.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init_set_str()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 0.0234.
|
|
char_ptr value = new char_ptr("234e-4");
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_str(x, value, 10);
|
|
|
|
// Assert that x is 40.
|
|
Assert.IsTrue(x.ToString() == "0.234e-1");
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_init_set_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number to 100.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(x, 100U);
|
|
|
|
// Assert that the value of x is 100.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 100.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_inp_str()
|
|
{
|
|
// Create and initialize op.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init(op);
|
|
|
|
// Write op to a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
System.IO.File.WriteAllText(pathname, "0.123456e6");
|
|
|
|
// Read op from the temporary file, and assert that the number of bytes read is 6.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "r");
|
|
Assert.IsTrue(gmp_lib.mpf_inp_str(op, stream, 10) == 10);
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that op is 123456.
|
|
Assert.IsTrue(gmp_lib.mpf_get_ui(op) == 123456U);
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_integer_p()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, 10);
|
|
|
|
// Assert that s is an integer.
|
|
Assert.IsTrue(gmp_lib.mpf_integer_p(x) != 0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_mul()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x * y.
|
|
gmp_lib.mpf_mul(z, x, y);
|
|
|
|
// Assert that the value of z is -2100.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -2100.0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpf_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_mul_2exp()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 100.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 100);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x * 2^8.
|
|
gmp_lib.mpf_mul_2exp(z, x, 8U);
|
|
|
|
// Assert that the value of z is 25600.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 25600.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_mul_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x * 210.
|
|
gmp_lib.mpf_mul_ui(z, x, 210U);
|
|
|
|
// Assert that the value of z is 2100.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 2100.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_neg()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = -x.
|
|
gmp_lib.mpf_neg(z, x);
|
|
|
|
// Assert that the value of z is -10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_out_str()
|
|
{
|
|
// Create, initialize, and set the value of op to 123456.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_ui(op, 123456U);
|
|
|
|
// Get a temporary file.
|
|
string pathname = System.IO.Path.GetTempFileName();
|
|
|
|
// Open temporary file for writing.
|
|
ptr<FILE> stream = new ptr<FILE>();
|
|
_wfopen_s(out stream.Value.Value, pathname, "w");
|
|
|
|
// Write op to temporary file, and assert that the number of bytes written is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_out_str(stream, 10, 0, op) == 10);
|
|
|
|
// Close temporary file.
|
|
fclose(stream.Value.Value);
|
|
|
|
// Assert that the content of the temporary file is "123456".
|
|
string result = System.IO.File.ReadAllText(pathname);
|
|
Assert.IsTrue(result == "0.123456e6");
|
|
|
|
// Delete temporary file.
|
|
System.IO.File.Delete(pathname);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_pow_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = sqrt(x).
|
|
gmp_lib.mpf_pow_ui(z, x, 3U);
|
|
|
|
// Assert that the value of z is 1000.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 1000.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_random2()
|
|
{
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpf_t rop = new mpf_t();
|
|
gmp_lib.mpf_init(rop);
|
|
|
|
// Generate a random floating-point number with at most 10 limbs and its exponent in [-5 5].
|
|
gmp_lib.mpf_random2(rop, 10, 5);
|
|
|
|
// Free all memory occupied by rop.
|
|
gmp_lib.mpf_clear(rop);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_reldiff()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = |x - y| / x.
|
|
gmp_lib.mpf_reldiff(z, x, y);
|
|
|
|
// Assert that the value of z is 22.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 22.0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpf_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set()
|
|
{
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 128U);
|
|
gmp_lib.mpf_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init2(y, 128U);
|
|
gmp_lib.mpf_set_si(y, -210);
|
|
|
|
// Assign the value of y to x.
|
|
gmp_lib.mpf_set(x, y);
|
|
|
|
// Assert that the value of x is -210.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -210.0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_d()
|
|
{
|
|
// Create and initialize a new floating-point number.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 128U);
|
|
|
|
// Set x to -123.0.
|
|
gmp_lib.mpf_set_d(x, -123.0);
|
|
|
|
// Assert that the value of x is -123.0.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -123.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_default_prec()
|
|
{
|
|
// Set default precision to 128 bits.
|
|
gmp_lib.mpf_set_default_prec(128U);
|
|
|
|
// Assert that the value of x is 128 bits.
|
|
Assert.IsTrue(gmp_lib.mpf_get_default_prec() == 128U);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_prec()
|
|
{
|
|
// Create and initialize a new floating-point number x.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
|
|
// Set its precision to 64 bits.
|
|
gmp_lib.mpf_set_prec(x, 64U);
|
|
|
|
// Assert that the value of x is 0.0, and that its precision is 64 bits.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 0.0);
|
|
Assert.IsTrue(gmp_lib.mpf_get_prec(x) == 64U);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_prec_raw()
|
|
{
|
|
// Set default precision to 128 bits.
|
|
gmp_lib.mpf_set_default_prec(128U);
|
|
|
|
// Create, initialize, and set a new rational y to 200 / 3.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_ui(y, 200, 3U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to y.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
gmp_lib.mpf_set_q(x, y);
|
|
|
|
Assert.IsTrue(x.ToString() == "0.6666666666666666666666666666666666666667e2");
|
|
|
|
// Change precision of x, and set its value to 10000 / 3.
|
|
gmp_lib.mpf_set_prec_raw(x, 8U);
|
|
gmp_lib.mpq_set_ui(y, 10000, 3U);
|
|
gmp_lib.mpf_set_q(x, y);
|
|
|
|
Assert.IsTrue(x.ToString() == "0.333333333333333333333e4");
|
|
|
|
// Restore precision of x.
|
|
gmp_lib.mpf_set_prec_raw(x, 128U);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.mpq_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_q()
|
|
{
|
|
// Create, initialize, and set a new rational y to 200 / 5.
|
|
mpq_t y = new mpq_t();
|
|
gmp_lib.mpq_init(y);
|
|
gmp_lib.mpq_set_ui(y, 200, 5U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to y.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
gmp_lib.mpf_set_q(x, y);
|
|
|
|
// Assert that x is 40.
|
|
Assert.IsTrue(x.ToString() == "0.4e2");
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.mpq_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_si()
|
|
{
|
|
// Create and initialize a new floating-point number.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 128U);
|
|
|
|
// Set x to -123.
|
|
gmp_lib.mpf_set_si(x, -123);
|
|
|
|
// Assert that the value of x is -123.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -123.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_str()
|
|
{
|
|
// Create, initialize, and set a new floating-point number x to 0.0234.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
char_ptr value = new char_ptr("234e-4");
|
|
gmp_lib.mpf_set_str(x, value, 10);
|
|
|
|
// Assert that x is 40.
|
|
Assert.IsTrue(x.ToString() == "0.234e-1");
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.free(value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_ui()
|
|
{
|
|
// Create and initialize a new floating-point number.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 128U);
|
|
|
|
// Set x to 100.
|
|
gmp_lib.mpf_set_ui(x, 100U);
|
|
|
|
// Assert that the value of x is 100.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == 100.0);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_set_z()
|
|
{
|
|
// Create, initialize, and set a new integer y to 200.
|
|
mpz_t y = new mpz_t();
|
|
gmp_lib.mpz_init(y);
|
|
gmp_lib.mpz_set_ui(y, 200U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to y.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init(x);
|
|
gmp_lib.mpf_set_z(x, y);
|
|
|
|
// Assert that x is 200.
|
|
Assert.IsTrue(x.ToString() == "0.2e3");
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clear(x);
|
|
gmp_lib.mpz_clear(y);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_sgn()
|
|
{
|
|
// Create, initialize, and set the value of op to -10.
|
|
mpf_t op = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(op, -10);
|
|
|
|
// Assert that the sign of op is -1.
|
|
Assert.IsTrue(gmp_lib.mpf_sgn(op) == -1);
|
|
|
|
// Release unmanaged memory allocated for op.
|
|
gmp_lib.mpf_clear(op);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_size()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x.
|
|
mpf_t x = "1.00000000000000000000001";
|
|
|
|
// Assert that the size of x is 1.
|
|
Assert.IsTrue(gmp_lib.mpf_size(x) == 4);
|
|
|
|
// Release unmanaged memory allocated for x.
|
|
gmp_lib.mpf_clear(x);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_sqrt()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 100.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 100);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = sqrt(x).
|
|
gmp_lib.mpf_sqrt(z, x);
|
|
|
|
// Assert that the value of z is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_sqrt_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = sqrt(100).
|
|
gmp_lib.mpf_sqrt_ui(z, 100U);
|
|
|
|
// Assert that the value of z is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clear(z);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_sub()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x - y.
|
|
gmp_lib.mpf_sub(z, x, y);
|
|
|
|
// Assert that the value of z is 220.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 220.0);
|
|
|
|
// Release unmanaged memory allocated for x, y, and z.
|
|
gmp_lib.mpf_clears(x, y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_sub_ui()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = x - 200.
|
|
gmp_lib.mpf_sub_ui(z, x, 200U);
|
|
|
|
// Assert that the value of z is -190.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == -190.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_swap()
|
|
{
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init2(x, 128U);
|
|
gmp_lib.mpf_set_si(x, 10);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init2(y, 128U);
|
|
gmp_lib.mpf_set_si(y, -210);
|
|
|
|
// Swap the values of x and y.
|
|
gmp_lib.mpf_swap(x, y);
|
|
|
|
// Assert that the value of x is -210.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(x) == -210.0);
|
|
|
|
// Assert that the value of y is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(y) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and y.
|
|
gmp_lib.mpf_clears(x, y, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_trunc()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.4.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_d(x, 10.4);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = trunc(x).
|
|
gmp_lib.mpf_trunc(z, x);
|
|
|
|
// Assert that the value of z is 10.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 10.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_ui_div()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number x to 10.
|
|
mpf_t x = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(x, 10);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = 210 / x.
|
|
gmp_lib.mpf_ui_div(z, 210U, x);
|
|
|
|
// Assert that the value of z is 21.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 21.0);
|
|
|
|
// Release unmanaged memory allocated for x and z.
|
|
gmp_lib.mpf_clears(x, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_ui_sub()
|
|
{
|
|
// Set default precision to 64 bits.
|
|
gmp_lib.mpf_set_default_prec(64U);
|
|
|
|
// Create, initialize, and set a new floating-point number y to -210.
|
|
mpf_t y = new mpf_t();
|
|
gmp_lib.mpf_init_set_si(y, -210);
|
|
|
|
// Create and initialize a new floating-point number z.
|
|
mpf_t z = new mpf_t();
|
|
gmp_lib.mpf_init(z);
|
|
|
|
// Set z = 10 - y.
|
|
gmp_lib.mpf_ui_sub(z, 10U, y);
|
|
|
|
// Assert that the value of z is 220.
|
|
Assert.IsTrue(gmp_lib.mpf_get_d(z) == 220.0);
|
|
|
|
// Release unmanaged memory allocated for y, and z.
|
|
gmp_lib.mpf_clears(y, z, null);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpf_urandomb()
|
|
{
|
|
// Create, initialize, and seed a new random number generator.
|
|
gmp_randstate_t state = new gmp_randstate_t();
|
|
gmp_lib.gmp_randinit_mt(state);
|
|
gmp_lib.gmp_randseed_ui(state, 100000U);
|
|
|
|
// Create, initialize, and set the value of rop to 0.
|
|
mpf_t rop = new mpf_t();
|
|
gmp_lib.mpf_init(rop);
|
|
|
|
// Generate a random integer in the range [0, 1) with 50 bits precision.
|
|
gmp_lib.mpf_urandomb(rop, state, 50);
|
|
|
|
// Free all memory occupied by state and rop.
|
|
gmp_lib.gmp_randclear(state);
|
|
gmp_lib.mpf_clear(rop);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Low level positive-integer (i.e. N) routines."
|
|
|
|
[TestMethod]
|
|
public void mpn_add()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = s1 + s2.
|
|
mp_limb_t carry = gmp_lib.mpn_add(rp, s1p, s1p.Size, s2p, s2p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_add_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = s1 + 1.
|
|
mp_limb_t carry = gmp_lib.mpn_add_1(rp, s1p, s1p.Size, 1);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_add_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = s1 + s2.
|
|
mp_limb_t carry = gmp_lib.mpn_add_n(rp, s1p, s2p, rp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_addmul_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[] { 0x00000002, 0x00000000 });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp += s1 * 2.
|
|
mp_limb_t carry = gmp_lib.mpn_addmul_1(rp, s1p, s1p.Size, 2);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 0x02);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_cmp()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
|
|
// Assert s1p > s2p.
|
|
Assert.IsTrue(gmp_lib.mpn_cmp(s1p, s2p, s1p.Size) > 0);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p, s2p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_zero_p()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Assert sp == 0.
|
|
Assert.IsTrue(gmp_lib.mpn_zero_p(sp, sp.Size) == 1);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(sp);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_divexact_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x55555555, 0x00005555 });
|
|
|
|
// Set rp = sp / 3.
|
|
gmp_lib.mpn_divexact_1(rp, sp, sp.Size, 0x3);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_divexact_by3()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x55555555, 0x00005555 });
|
|
|
|
// Set rp = sp / 3.
|
|
mp_limb_t remainder = gmp_lib.mpn_divexact_by3(rp, sp, sp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(remainder == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_divexact_by3c()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xaaaaaaaa, 0x5555aaaa });
|
|
|
|
// Set rp = sp / 3.
|
|
mp_limb_t remainder = gmp_lib.mpn_divexact_by3c(rp, sp, sp.Size, 1);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(remainder == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_divrem_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr r1p = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x435e50d7, 0x00000d79 });
|
|
|
|
// Set r1p = s2p / 19.
|
|
mp_limb_t remainder = gmp_lib.mpn_divrem_1(r1p, 0, s2p, s2p.Size, 0x13);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(remainder == 10);
|
|
Assert.IsTrue(r1p.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(r1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_divmod_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr r1p = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x435e50d7, 0x00000d79 });
|
|
|
|
// Set r1p = s2p / 19.
|
|
mp_limb_t remainder = gmp_lib.mpn_divmod_1(r1p, s2p, s2p.Size, 0x13);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(remainder == 10);
|
|
Assert.IsTrue(r1p.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(r1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_gcd()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr xp = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
mp_ptr yp = new mp_ptr(new uint[] { 0xc2d24d55, 0x00000007 });
|
|
mp_ptr rp = new mp_ptr(yp.Size);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x964619c7, 0x00000002 });
|
|
|
|
// Set rp = gcd(xp, yp).
|
|
mp_size_t size = gmp_lib.mpn_gcd(rp, xp, xp.Size, yp, yp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(size == result.Size);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, xp, yp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_gcd_1()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr xp = new mp_ptr(new uint[] { 0x00000000, 0x00000001 });
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(gmp_lib.mpn_gcd_1(xp, xp.Size, 1073741824) == 1073741824);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(xp);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_gcdext()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr up = new mp_ptr(new uint[] { 0x40000000, 0x00000000 });
|
|
mp_ptr vp = new mp_ptr(new uint[] { 0x00000000, 0x00000001 });
|
|
mp_ptr gp = new mp_ptr(new uint[vp.Size * (IntPtr.Size / 4)]);
|
|
mp_ptr sp = new mp_ptr(new uint[(vp.Size + 1) * (IntPtr.Size / 4)]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x40000000, 0x00000000 });
|
|
mp_ptr cofactor = new mp_ptr(new uint[] { 0x00000001, 0x00000000, 0x00000000 });
|
|
|
|
// Set gp = gcd(up, vp).
|
|
ptr<mp_size_t> sn = new ptr<mp_size_t>(0);
|
|
mp_size_t size = gmp_lib.mpn_gcdext(gp, sp, sn, up, up.Size, vp, vp.Size);
|
|
|
|
// Assert result.
|
|
Assert.IsTrue(size == 1);
|
|
Assert.IsTrue(gp.SequenceEqual(result));
|
|
Assert.IsTrue(sn.Value == 1);
|
|
Assert.IsTrue(sp.SequenceEqual(cofactor));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(gp, up, vp, sp, result, cofactor);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_get_str()
|
|
{
|
|
// Create multi-precision operands.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0x00000001, 0x00000001 });
|
|
char_ptr str = new char_ptr("xxxxxxxxxxxxxxxxx");
|
|
|
|
// Convert s1p to hex string.
|
|
size_t count = gmp_lib.mpn_get_str(str, 16, s1p, s1p.Size);
|
|
|
|
// Copy out str to bytes.
|
|
byte[] s = new byte[count];
|
|
Marshal.Copy(str.ToIntPtr(), s, 0, (int)count);
|
|
|
|
// Assert the non-ASCII, hex representation of s1p.
|
|
Assert.IsTrue(s.SequenceEqual(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 }));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_hamdist()
|
|
{
|
|
// Create multi-precision operands.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0xffffffff });
|
|
|
|
// Assert hamming distance.
|
|
Assert.IsTrue(gmp_lib.mpn_hamdist(s1p, s2p, s1p.Size) == 31);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p, s2p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_lshift()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffc, 0xffffffff });
|
|
|
|
// Set rp = sp << 1.
|
|
mp_limb_t bits = gmp_lib.mpn_lshift(rp, sp, sp.Size, 1);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(bits == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_mod_1()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xfffffffe, 0x0000ffff });
|
|
|
|
// Assert s1p mod 3 is 2.
|
|
Assert.IsTrue(gmp_lib.mpn_mod_1(s1p, s1p.Size, 3) == 2);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_mul()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000002 });
|
|
mp_ptr rp = new mp_ptr(new uint[3]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff, 0x00000001 });
|
|
|
|
// Set rp = s1 * s2.
|
|
gmp_lib.mpn_mul(rp, s1p, s1p.Size, s2p, s2p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_mul_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1 * 2.
|
|
mp_limb_t carry = gmp_lib.mpn_mul_1(rp, s1p, s1p.Size, 2);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_mul_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000002, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(new uint[4]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff, 0x00000001, 0x00000000 });
|
|
|
|
// Set rp = s1 * s2.
|
|
gmp_lib.mpn_mul_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sqr()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[4]);
|
|
mp_ptr result = new mp_ptr(new uint[] {0x00000001, 0x00000000, 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1^2.
|
|
gmp_lib.mpn_sqr(rp, s1p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_neg()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x0000001, 0x00000000 });
|
|
|
|
// Set rp = -sp.
|
|
mp_limb_t borrow = gmp_lib.mpn_neg(rp, sp, sp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_com()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xf0f0f0f0, 0xf0f0f0f0 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x0f0f0f0f, 0x0f0f0f0f });
|
|
|
|
// Set rp = not(sp).
|
|
gmp_lib.mpn_com(rp, sp, sp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_perfect_square_p()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
|
|
// Assert s1p is not a perfect square.
|
|
Assert.IsTrue(gmp_lib.mpn_perfect_square_p(s1p, s1p.Size) == 0);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_perfect_power_p()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xd4a51000, 0x000000e8 });
|
|
|
|
// Assert s1p is a perfect power.
|
|
Assert.IsTrue(gmp_lib.mpn_perfect_power_p(s1p, s1p.Size) != 0);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_popcount()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0x0000001, 0x00000001 });
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(gmp_lib.mpn_popcount(s1p, s1p.Size) == 2);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_random()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr r1p = new mp_ptr(new uint[2]);
|
|
|
|
// Generate random number.
|
|
gmp_lib.mpn_random(r1p, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 1);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(r1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_random2()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr r1p = new mp_ptr(new uint[2]);
|
|
|
|
// Generate random number.
|
|
gmp_lib.mpn_random2(r1p, gmp_lib.mp_bytes_per_limb == 4 ? 2 : 1);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(r1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_rshift()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xffffffff, 0x7fffffff });
|
|
|
|
// Set rp = sp >> 1.
|
|
mp_limb_t bits = gmp_lib.mpn_rshift(rp, sp, sp.Size, 1);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(bits == (gmp_lib.mp_bytes_per_limb == 4 ? 0x80000000 : 0x8000000000000000));
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_scan0()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0x0000001, 0x00000001 });
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(gmp_lib.mpn_scan0(s1p, 0) == 1);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_scan1()
|
|
{
|
|
// Create multi-precision operand.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0x0000001, 0x00000001 });
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(gmp_lib.mpn_scan1(s1p, 1) == 32);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(s1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_set_str()
|
|
{
|
|
// Create multi-precision operands.
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
byte[] s = new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 };
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001, 0x00000001 });
|
|
char_ptr str = new char_ptr("xxxxxxxxxxxxxxxxx");
|
|
Marshal.Copy(s, 0, str.ToIntPtr(), 9);
|
|
|
|
// Convert rp from str in hex base.
|
|
mp_size_t count = gmp_lib.mpn_set_str(rp, str, 9, 16);
|
|
|
|
// Assert the non-ASCII, hex representation of s1p.
|
|
Assert.IsTrue(count == rp.Size);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp);
|
|
gmp_lib.free(str);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sizeinbase()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr xp = new mp_ptr(new uint[] { 0x00000001, 0x00000001 });
|
|
|
|
// Assert that the number of bits required is 33.
|
|
Assert.IsTrue(gmp_lib.mpn_sizeinbase(xp, xp.Size, 2) == 33);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(xp);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sqrtrem()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0x00000001, 0x00000001 });
|
|
mp_ptr r1p = new mp_ptr(new uint[sp.Size * (gmp_lib.mp_bytes_per_limb / 4)]);
|
|
mp_ptr r2p = new mp_ptr(new uint[sp.Size * (gmp_lib.mp_bytes_per_limb / 4)]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00010000, 0x00000000 });
|
|
mp_ptr remainder = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
|
|
// Set r1p = trunc(sqrt(sp)), r2p = sp - r1p^2
|
|
mp_size_t r2n = gmp_lib.mpn_sqrtrem(r1p, r2p, sp, sp.Size);
|
|
|
|
// Assert result.
|
|
Assert.IsTrue(r2n == 1);
|
|
Assert.IsTrue(r1p.SequenceEqual(result));
|
|
Assert.IsTrue(r2p.SequenceEqual(remainder));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(sp, r1p, r2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sub()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1 - s2.
|
|
mp_limb_t borrow = gmp_lib.mpn_sub(rp, s1p, s1p.Size, s2p, s2p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sub_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1 - 1.
|
|
mp_limb_t borrow = gmp_lib.mpn_sub_1(rp, s1p, s1p.Size, 1);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sub_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1 - s2.
|
|
mp_limb_t borrow = gmp_lib.mpn_sub_n(rp, s1p, s2p, rp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_submul_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(new uint[] { 0x00000002, 0x00000000 });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000004, 0x00000000 });
|
|
|
|
// Set rp -= s1 * 2.
|
|
mp_limb_t borrow = gmp_lib.mpn_submul_1(rp, s1p, s1p.Size, 2);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0x02);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_tdiv_qr()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr np = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr dp = new mp_ptr(new uint[] { 0x00000013 });
|
|
mp_ptr qp = new mp_ptr(new uint[np.Size - dp.Size + 1]);
|
|
mp_ptr rp = new mp_ptr(new uint[dp.Size]);
|
|
mp_ptr quotient = new mp_ptr(new uint[] { 0x435e50d7, 0x00000d79 });
|
|
mp_ptr remainder = new mp_ptr(new uint[] { 0x0000000a });
|
|
|
|
// Set rp = np / dp.
|
|
gmp_lib.mpn_tdiv_qr(qp, rp, 0, np, np.Size, dp, dp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(qp.SequenceEqual(quotient));
|
|
Assert.IsTrue(rp.SequenceEqual(remainder));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(qp, rp, np, dp, quotient, remainder);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_and_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
|
|
// Set rp = s1 and s2.
|
|
gmp_lib.mpn_and_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_andn_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xedcba987 });
|
|
|
|
// Set rp = s1 and not s2.
|
|
gmp_lib.mpn_andn_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_nand_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
|
|
// Set rp = not(s1 and s2).
|
|
gmp_lib.mpn_and_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_ior_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
|
|
// Set rp = s1 or s2.
|
|
gmp_lib.mpn_ior_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_iorn_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
|
|
// Set rp = s1 or not s2.
|
|
gmp_lib.mpn_iorn_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_nior_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = not (s1 or s2).
|
|
gmp_lib.mpn_nior_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_xor_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xedcba987 });
|
|
|
|
// Set rp = s1 xor s2.
|
|
gmp_lib.mpn_xor_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_xnor_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001, 0x12345678 });
|
|
|
|
// Set rp = not(s1 xor s2).
|
|
gmp_lib.mpn_xnor_n(rp, s1p, s2p, s1p.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_copyi()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xf0f0f0f0, 0xf0f0f0f0 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xf0f0f0f0, 0xf0f0f0f0 });
|
|
|
|
// Set rp = sp.
|
|
gmp_lib.mpn_copyi(rp, sp, sp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_copyd()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr sp = new mp_ptr(new uint[] { 0xf0f0f0f0, 0xf0f0f0f0 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xf0f0f0f0, 0xf0f0f0f0 });
|
|
|
|
// Set rp = sp.
|
|
gmp_lib.mpn_copyd(rp, sp, sp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, sp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_zero()
|
|
{
|
|
// Create multi-precision operand, and expected result.
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = sp.
|
|
gmp_lib.mpn_zero(rp, rp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_cnd_add_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
|
|
// Set rp = s1 + s2.
|
|
mp_limb_t carry = gmp_lib.mpn_cnd_add_n(1, rp, s1p, s2p, rp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_cnd_sub_n()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr s1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr s2p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(new uint[2]);
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
|
|
// Set rp = s1 - s2.
|
|
mp_limb_t borrow = gmp_lib.mpn_cnd_sub_n(1, rp, s1p, s2p, rp.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, s1p, s2p, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_add_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000000, 0x00000000 });
|
|
mp_ptr rp = new mp_ptr(result.Size);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_add_1_itch(ap.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = ap + 1.
|
|
mp_limb_t carry = gmp_lib.mpn_sec_add_1(rp, ap, ap.Size, 1, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(carry == 1);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, ap, tp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_sub_1()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(result.Size);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_sub_1_itch(ap.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = ap - 1.
|
|
mp_limb_t borrow = gmp_lib.mpn_sec_sub_1(rp, ap, ap.Size, 1, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(borrow == 0);
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, ap, tp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_cnd_swap()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr bp = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr a1p = new mp_ptr(new uint[] { 0x00000001, 0x00000000 });
|
|
mp_ptr b1p = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
|
|
// Exchange ab and bp.
|
|
gmp_lib.mpn_cnd_swap(1, ap, bp, ap.Size);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(ap.SequenceEqual(a1p));
|
|
Assert.IsTrue(bp.SequenceEqual(b1p));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(ap, bp, a1p, b1p);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_mul()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr bp = new mp_ptr(new uint[] { 0x00000002 });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0xfffffffe, 0xffffffff, 0x00000001 });
|
|
mp_ptr rp = new mp_ptr(ap.Size + bp.Size);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_mul_itch(ap.Size, bp.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = ap * bp.
|
|
gmp_lib.mpn_sec_mul(rp, ap, ap.Size, bp, bp.Size, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, ap, bp, tp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_sqr()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 0xffffffff, 0xffffffff });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001, 0x00000000, 0xfffffffe, 0xffffffff });
|
|
mp_ptr rp = new mp_ptr(2 * ap.Size);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_sqr_itch(ap.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = s1^2.
|
|
gmp_lib.mpn_sec_sqr(rp, ap, ap.Size, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, ap, tp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_powm()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr bp = new mp_ptr(new uint[] { 0x00000002 });
|
|
mp_ptr ep = new mp_ptr(new uint[] { 0x00000004 });
|
|
mp_ptr mp = new mp_ptr(new uint[] { 0x00000003 });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x00000001 });
|
|
mp_ptr rp = new mp_ptr(bp.Size);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_powm_itch(bp.Size, 3, mp.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = bp^ep mod mp.
|
|
gmp_lib.mpn_sec_powm(rp, bp, bp.Size, ep, 3, mp, mp.Size, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(rp, bp, ep, mp, tp, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_tabselect()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr tab = new mp_ptr(new uint[] { 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x33333333, 0x00000000 });
|
|
mp_ptr result = new mp_ptr(new uint[] { 0x33333333 });
|
|
mp_ptr rp = new mp_ptr(result.Size);
|
|
|
|
// Set rp to third entry in tab.
|
|
gmp_lib.mpn_sec_tabselect(rp, tab, 1, tab.Size, 2);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp.SequenceEqual(result));
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(tab, result);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_div_qr()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr np = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr dp = new mp_ptr(new uint[] { 0x00000003 });
|
|
mp_ptr remainder = new mp_ptr(new uint[] { 0x00000000 });
|
|
mp_ptr qp = new mp_ptr(new uint[np.Size]);
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_div_qr_itch(np.Size, dp.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set qp = floor(np / dp) and rp = np mod dp.
|
|
mp_limb_t mslimb = gmp_lib.mpn_sec_div_qr(qp, np, np.Size, dp, dp.Size, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(mslimb == (ulong)(gmp_lib.mp_bytes_per_limb == 4 ? 0x00005555 : 0x0000555555555555));
|
|
Assert.IsTrue(qp[0] == (ulong)(gmp_lib.mp_bytes_per_limb == 4 ? 0x55555555 : 0x0000000000000000));
|
|
Assert.IsTrue(np[0] == remainder[0]);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(qp, np, dp, remainder, tp);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_div_r()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr np = new mp_ptr(new uint[] { 0xffffffff, 0x0000ffff });
|
|
mp_ptr dp = new mp_ptr(new uint[] { 0x00000004 });
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_div_r_itch(np.Size, dp.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set np = np mod dp.
|
|
gmp_lib.mpn_sec_div_r(np, np.Size, dp, dp.Size, tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(np[0] == 3);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(np, dp, tp);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void mpn_sec_invert()
|
|
{
|
|
// Create multi-precision operands, and expected result.
|
|
mp_ptr ap = new mp_ptr(new uint[] { 3 });
|
|
mp_ptr mp = new mp_ptr(new uint[] { 11 });
|
|
mp_ptr rp = new mp_ptr(ap.Size);
|
|
mp_ptr result = new mp_ptr(new uint[] { 4 });
|
|
|
|
// Create scratch space.
|
|
mp_size_t size = gmp_lib.mpn_sec_invert_itch(ap.Size);
|
|
mp_ptr tp = new mp_ptr(size);
|
|
|
|
// Set rp = ap^-1 mod mp.
|
|
gmp_lib.mpn_sec_invert(rp, ap, mp, ap.Size, (uint)(2 * ap.Size * gmp_lib.mp_bits_per_limb), tp);
|
|
|
|
// Assert result of operation.
|
|
Assert.IsTrue(rp[0] == result[0]);
|
|
|
|
// Release unmanaged memory.
|
|
gmp_lib.free(ap, mp, rp, result, tp);
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|