<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" />

Rounding

class Rounding
using System; namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium { internal class Rounding { public static int[] Power2Round(int a) { int[] array = new int[2] { a + 4096 - 1 >> 13, 0 }; array[1] = a - (array[0] << 13); return array; } public static int[] Decompose(int a, int gamma2) { int num = a + 127 >> 7; switch (gamma2) { case 261888: num = num * 1025 + 2097152 >> 22; num &= 15; break; case 95232: num = num * 11275 + 8388608 >> 24; num ^= ((43 - num >> 31) & num); break; default: throw new ArgumentException("Wrong Gamma2!"); } int num2 = a - num * 2 * gamma2; num2 -= ((4190208 - num2 >> 31) & 8380417); return new int[2] { num2, num }; } public static int MakeHint(int a0, int a1, DilithiumEngine engine) { int gamma = engine.Gamma2; int num = 8380417; if (a0 <= gamma || a0 > num - gamma || (a0 == num - gamma && a1 == 0)) return 0; return 1; } public static int UseHint(int a, int hint, int gamma2) { int[] array = Decompose(a, gamma2); int num = array[0]; int num2 = array[1]; if (hint != 0) { switch (gamma2) { case 261888: if (num > 0) return (num2 + 1) & 15; return (num2 - 1) & 15; case 95232: if (num > 0) { if (num2 != 43) return num2 + 1; return 0; } if (num2 != 0) return num2 - 1; return 43; default: throw new ArgumentException("Wrong Gamma2!"); } } return num2; } } }