private void GenerateFQ(IRandom Rng, out IPolynomial t, out IntegerPolynomial fq, out IntegerPolynomial fp) { int N = _encParams.N; int q = _encParams.Q; int df = _encParams.DF; int df1 = _encParams.DF1; int df2 = _encParams.DF2; int df3 = _encParams.DF3; bool fastFp = _encParams.FastFp; bool sparse = _encParams.Sparse; TernaryPolynomialType polyType = _encParams.PolyType; fp = null; // choose a random f that is invertible mod 3 and q while (true) { IntegerPolynomial f; // choose random t, calculate f and fp if (fastFp) { // if fastFp=true, f is always invertible mod 3 if (polyType == TernaryPolynomialType.SIMPLE) { t = PolynomialGenerator.GenerateRandomTernary(N, df, df, sparse, Rng); } else { t = ProductFormPolynomial.GenerateRandom(N, df1, df2, df3, df3, Rng); } f = t.ToIntegerPolynomial(); f.Multiply(3); f.Coeffs[0] += 1; } else { if (polyType == TernaryPolynomialType.SIMPLE) { t = PolynomialGenerator.GenerateRandomTernary(N, df, df - 1, sparse, Rng); } else { t = ProductFormPolynomial.GenerateRandom(N, df1, df2, df3, df3 - 1, Rng); } f = t.ToIntegerPolynomial(); fp = f.InvertF3(); if (fp == null) { continue; } } fq = f.InvertFq(q); if (fq != null) { break; } } }
private void GenerateFQ(IRandom Rng, out IPolynomial T, out IntegerPolynomial Fq, out IntegerPolynomial Fp) { var N = this.m_ntruParams.N; var q = this.m_ntruParams.Q; var df = this.m_ntruParams.DF; var df1 = this.m_ntruParams.DF1; var df2 = this.m_ntruParams.DF2; var df3 = this.m_ntruParams.DF3; var fastFp = this.m_ntruParams.FastFp; var sparse = this.m_ntruParams.Sparse; var polyType = this.m_ntruParams.PolyType; Fp = null; // choose a random f that is invertible mod 3 and q while (true) { IntegerPolynomial f; // choose random t, calculate f and fp if (fastFp) { // if fastFp=true, f is always invertible mod 3 if (polyType == TernaryPolynomialType.SIMPLE) { T = PolynomialGenerator.GenerateRandomTernary(N, df, df, sparse, Rng); } else { T = ProductFormPolynomial.GenerateRandom(N, df1, df2, df3, df3, Rng); } f = T.ToIntegerPolynomial(); f.Multiply(3); f.Coeffs[0] += 1; } else { if (polyType == TernaryPolynomialType.SIMPLE) { T = PolynomialGenerator.GenerateRandomTernary(N, df, df - 1, sparse, Rng); } else { T = ProductFormPolynomial.GenerateRandom(N, df1, df2, df3, df3 - 1, Rng); } f = T.ToIntegerPolynomial(); Fp = f.InvertF3(); if (Fp == null) { continue; } } Fq = f.InvertFq(q); if (Fq != null) { break; } } }