def randomize(self, prime): assert not self.randomized prev = None for i in xrange(0, len(self.bp)): d_i_minus_one = self.bp[i].zero.nrows() d_i = self.bp[i].zero.ncols() MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), d_i_minus_one, d_i) MSZp_square = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), d_i, d_i) if i != 0: MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), d_i_minus_one, d_i) self.bp[i] = self.bp[i].group(MSZp, prime).mult_left(prev.adjoint()) if i != len(self.bp) - 1: cur = MSZp_square.random_element() self.bp[i] = self.bp[i].group(MSZp, prime).mult_right(cur) prev = cur # compute S * B_0 d_0 = self.bp[0].zero.nrows() d_1 = self.bp[0].zero.ncols() S = matrix.identity(d_0) for i in xrange(d_0): S[i, i] = random.randint(0, prime - 1) MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), d_0, d_1) self.bp[0] = self.bp[0].group(MSZp, prime).mult_left(S) # compute B_ell * T r = self.bp[-1].zero.nrows() c = self.bp[-1].zero.ncols() T = matrix.identity(c) for i in xrange(c): T[i, i] = random.randint(0, prime - 1) MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), r, c) self.bp[-1] = self.bp[-1].group(MSZp, prime).mult_right(T) self.randomized = True
def randomize(self, prime): assert not self.randomized MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), self.size) def random_matrix(): while True: m = MSZp.random_element() if not m.is_singular() and m.rank() == self.size: return m, m.inverse() m0, m0i = random_matrix() self.bp[0] = self.bp[0].group(MSZp, prime).mult_left(m0) for i in xrange(1, len(self.bp)): mi, mii = random_matrix() self.bp[i-1] = self.bp[i-1].group(MSZp, prime).mult_right(mii) self.bp[i] = self.bp[i].group(MSZp, prime).mult_left(mi) self.bp[-1] = self.bp[-1].group(MSZp, prime).mult_right(m0i) VSZp = VectorSpace(ZZ.residue_field(ZZ.ideal(prime)), self.size) self.s = copy(VSZp.zero()) self.s[0] = 1 self.t = copy(VSZp.zero()) self.t[len(self.t) - 1] = 1 self.m0, self.m0i = m0, m0i self.randomized = True
def randomize(self, prime): assert not self.randomized MSZp = MatrixSpace(ZZ.residue_field(ZZ.ideal(prime)), self.size) def random_matrix(): while True: m = MSZp.random_element() if not m.is_singular() and m.rank() == self.size: return m, m.inverse() m0, m0i = random_matrix() self.bp[0] = self.bp[0].group(MSZp, prime).mult_left(m0) for i in xrange(1, len(self.bp)): mi, mii = random_matrix() self.bp[i - 1] = self.bp[i - 1].group(MSZp, prime).mult_right(mii) self.bp[i] = self.bp[i].group(MSZp, prime).mult_left(mi) self.bp[-1] = self.bp[-1].group(MSZp, prime).mult_right(m0i) VSZp = VectorSpace(ZZ.residue_field(ZZ.ideal(prime)), self.size) self.s = copy(VSZp.zero()) self.s[0] = 1 self.t = copy(VSZp.zero()) self.t[len(self.t) - 1] = 1 self.m0, self.m0i = m0, m0i self.randomized = True