public void BinaryEncodeDecodeBigUIntNET() { var modulus = new BigUInt("FFFFFFFFFFFFFFFF"); var encoder = new BinaryEncoder(modulus); var value = new BigUInt(64); value.Set("0"); var poly = encoder.Encode(value); Assert.AreEqual(0, poly.GetSignificantCoeffCount()); Assert.IsTrue(poly.IsZero); Assert.AreEqual(value, encoder.DecodeBigUInt(poly)); value.Set("1"); var poly1 = encoder.Encode(value); Assert.AreEqual(1, poly1.GetSignificantCoeffCount()); Assert.AreEqual(1, poly1.CoeffBitCount); Assert.AreEqual("1", poly1.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly1)); value.Set("2"); var poly2 = encoder.Encode(value); Assert.AreEqual(2, poly2.GetSignificantCoeffCount()); Assert.AreEqual(1, poly2.CoeffBitCount); Assert.AreEqual("1x^1", poly2.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly2)); value.Set("3"); var poly3 = encoder.Encode(value); Assert.AreEqual(2, poly3.GetSignificantCoeffCount()); Assert.AreEqual(1, poly3.CoeffBitCount); Assert.AreEqual("1x^1 + 1", poly3.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly3)); value.Set("FFFFFFFFFFFFFFFF"); var poly4 = encoder.Encode(value); Assert.AreEqual(64, poly4.GetSignificantCoeffCount()); Assert.AreEqual(1, poly4.CoeffBitCount); for (int i = 0; i < 64; ++i) { Assert.AreEqual("1", poly4[i].ToString()); } Assert.AreEqual(value, encoder.DecodeBigUInt(poly4)); value.Set("80F02"); var poly5 = encoder.Encode(value); Assert.AreEqual(20, poly5.GetSignificantCoeffCount()); Assert.AreEqual(1, poly5.CoeffBitCount); for (int i = 0; i < 20; ++i) { if (i == 19 || (i >= 8 && i <= 11) || i == 1) { Assert.AreEqual("1", poly5[i].ToString()); } else { Assert.IsTrue(poly5[i].IsZero); } } Assert.AreEqual(value, encoder.DecodeBigUInt(poly5)); var poly6 = new BigPoly(3, 10); poly6[0].Set(1); poly6[1].Set(500); poly6[2].Set(1023); value.Set(1 + 500 * 2 + 1023 * 4); Assert.AreEqual(value, encoder.DecodeBigUInt(poly6)); modulus.Set(1024); var encoder2 = new BinaryEncoder(modulus); var poly7 = new BigPoly(4, 10); poly7[0].Set(1023); // -1 (*1) poly7[1].Set(512); // -512 (*2) poly7[2].Set(511); // 511 (*4) poly7[3].Set(1); // 1 (*8) value.Set(-1 + -512 * 2 + 511 * 4 + 1 * 8); Assert.AreEqual(value, encoder2.DecodeBigUInt(poly7)); }
public void BinaryEncodeDecodeBigUIntNET() { var modulus = new SmallModulus(0xFFFFFFFFFFFFFFF); var encoder = new BinaryEncoder(modulus, MemoryPoolHandle.New()); var value = new BigUInt(64); value.Set("0"); var poly = encoder.Encode(value); Assert.AreEqual(0, poly.SignificantCoeffCount()); Assert.IsTrue(poly.IsZero); Assert.AreEqual(value, encoder.DecodeBigUInt(poly)); value.Set("1"); var poly1 = encoder.Encode(value); Assert.AreEqual(1, poly1.SignificantCoeffCount()); Assert.AreEqual("1", poly1.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly1)); value.Set("2"); var poly2 = encoder.Encode(value); Assert.AreEqual(2, poly2.SignificantCoeffCount()); Assert.AreEqual("1x^1", poly2.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly2)); value.Set("3"); var poly3 = encoder.Encode(value); Assert.AreEqual(2, poly3.SignificantCoeffCount()); Assert.AreEqual("1x^1 + 1", poly3.ToString()); Assert.AreEqual(value, encoder.DecodeBigUInt(poly3)); value.Set("FFFFFFFFFFFFFFFF"); var poly4 = encoder.Encode(value); Assert.AreEqual(64, poly4.SignificantCoeffCount()); for (int i = 0; i < 64; ++i) { Assert.AreEqual("1", poly4[i].ToString()); } Assert.AreEqual(value, encoder.DecodeBigUInt(poly4)); value.Set("80F02"); var poly5 = encoder.Encode(value); Assert.AreEqual(20, poly5.SignificantCoeffCount()); for (int i = 0; i < 20; ++i) { if (i == 19 || (i >= 8 && i <= 11) || i == 1) { Assert.AreEqual("1", poly5[i].ToString()); } else { Assert.IsTrue(poly5[i] == 0); } } Assert.AreEqual(value, encoder.DecodeBigUInt(poly5)); var poly6 = new Plaintext(3); poly6[0] = 1; poly6[1] = 500; poly6[2] = 1023; value.Set(1 + 500 * 2 + 1023 * 4); Assert.AreEqual(value, encoder.DecodeBigUInt(poly6)); modulus.Set(1024); var encoder2 = new BinaryEncoder(modulus, MemoryPoolHandle.New()); var poly7 = new Plaintext(4); poly7[0] = 1023; // -1 (*1) poly7[1] = 512; // -512 (*2) poly7[2] = 511; // 511 (*4) poly7[3] = 1; // 1 (*8) value.Set(-1 + -512 * 2 + 511 * 4 + 1 * 8); Assert.AreEqual(value, encoder2.DecodeBigUInt(poly7)); }