def _rand_der(self): r""" Produces a random derangement of `[1, 2, \ldots, n]`. This is an implementation of the algorithm described by Martinez et. al. in [MPP2008]_. EXAMPLES:: sage: D = Derangements(4) sage: d = D._rand_der() sage: d in D True """ n = len(self._set) A = list(range(1, n + 1)) mark = [x < 0 for x in A] i, u = n, n while u >= 2: if not (mark[i - 1]): while True: j = randrange(1, i) if not (mark[j - 1]): A[i - 1], A[j - 1] = A[j - 1], A[i - 1] break p = random() if p < (u - 1) * self._count_der(u - 2) // self._count_der(u): mark[j - 1] = True u -= 1 u -= 1 i -= 1 return A
def random_element(self): r""" Produces all derangements of a positive integer, a list, or a string. The list or string may contain repeated elements. If an integer `n` is given, then a random derangements of `[1, 2, 3, \ldots, n]` is returned For an integer, or a list or string with all elements distinct, the value is obtained by an algorithm described in [MPP2008]_. For a list or string with repeated elements the derangement is formed by choosing an element at random from the list of all possible derangements. OUTPUT: A single list or string containing a derangement, or an empty list if there are no derangements. EXAMPLES:: sage: D = Derangements(4) sage: D.random_element() # random [2, 3, 4, 1] sage: D = Derangements(['A','AT','CAT','CATS','CARTS','CARETS']) sage: D.random_element() # random ['AT', 'CARTS', 'A', 'CAT', 'CARETS', 'CATS'] sage: D = Derangements('UNCOPYRIGHTABLE') sage: D.random_element() # random ['C', 'U', 'I', 'H', 'O', 'G', 'N', 'B', 'E', 'L', 'A', 'R', 'P', 'Y', 'T'] sage: D = Derangements([1,1,1,1,2,2,2,2,3,3,3,3]) sage: D.random_element() # random [3, 2, 2, 3, 1, 3, 1, 3, 2, 1, 1, 2] sage: D = Derangements('ESSENCES') sage: D.random_element() # random ['N', 'E', 'E', 'C', 'S', 'S', 'S', 'E'] sage: D = Derangements([1,1,2,2,2]) sage: D.random_element() [] TESTS: Check that index error discovered in :trac:`29974` is fixed:: sage: D = Derangements([1,1,2,2]) sage: _ = [D.random_element() for _ in range(20)] """ if self.__multi: L = list(self) if len(L) == 0: return self.element_class(self, []) i = randrange(len(L)) return L[i] temp = self._rand_der() return self.element_class(self, [self._set[ii - 1] for ii in temp])
def _fork_test_func(iterator=None): """ Test function for `fork()`. See `fork_test()` and others. """ if not iterator: import itertools iterator = itertools.count() x = None for i in iterator: m = matrix(QQ, 100, [randrange(-100,100) for i in range(100*100)]) x = m.kernel() print x return x
def test_irred(p, i1, i2, number=0, repeat=3): K = GF(p) P = FFDesc(p, irred(K, i1).list()) Q = FFDesc(p, irred(K, i2).list()) R = P.compositum(Q) context = globals() context.update(locals()) # must be done only once to avoid (dis)counting caching tcomp = sage_timeit('P.compositum(Q)', context, number=1, repeat=1, seconds=True) a = FFElt(P, [randrange(p) for i in range(i1)]) b = FFElt(Q, [randrange(p) for i in range(i2)]) c = FFElt(R, [randrange(p) for i in range(i1*i2)]) context = globals() context.update(locals()) tembed_pre = sage_timeit('a.embed(b,R)', context, number=1, repeat=1, seconds=True) tembed = sage_timeit('a.embed(b,R)', context, number=number, repeat=repeat, seconds=True) # Burn R's precomputed polynomials ab = a.embed(b,R) ab.project(P,b) ab = a.embed(b, R) d = a.embed(b, R) context = globals() context.update(locals()) tproject_pre = sage_timeit('ab.project(P,b)', context, number=1, repeat=1, seconds=True) tproject = sage_timeit('ab.project(P,b)', context, number=number, repeat=repeat, seconds=True) tmono2dual = (sage_timeit('c.embed(P, P)', context, number=1, repeat=1, seconds=True) - sage_timeit('c.embed(P, P)', context, number=1, repeat=1, seconds=True)) tmul = sage_timeit('c*c', context, number=number, repeat=repeat, seconds=True) ttmul = sage_timeit('c*d', context, number=number, repeat=repeat, seconds=True) tiso = sage_timeit('c.eltseq_dual_python(P,Q)', context, number=number, repeat=repeat, seconds=True) tbsgs = sage_timeit('c.eltseq_dual_BSGS(P,Q)', context, number=number, repeat=repeat, seconds=True) tmatrix = sage_timeit('c.eltseq_dual_matrix(P,Q)', context, number=number, repeat=repeat, seconds=True) return tcomp, tembed_pre, tembed, tproject_pre, tproject, tmono2dual, tmul, ttmul, tiso, tbsgs, tmatrix
def __init__(self, dp, entity): TB_sequential.__init__(self, dp, entity) op_count = 10 self.add_port("x: in std_logic_vector") self.add_port("y: in std_logic_vector") self.add_port("z: out std_logic_vector") # Build signal self.add_signal( "signal x_sti: std_logic_vector(c_N-1 downto 0) := (others=>'0')" ) self.add_signal( "signal y_sti: std_logic_vector (c_K-1 downto 0) := (others=>'0')" ) self.add_signal("signal z_obs: Fp_element := c_FP_ZERO") # Build port map self.add_port_map("x => x_sti") self.add_port_map("y => y_sti") self.add_port_map("z => z_obs") # Build function parameters self.add_func_param("x : std_logic_vector(c_N-1 downto 0)") self.add_func_param("y : std_logic_vector(c_K-1 downto 0)") self.add_func_param("z : Fp_element") # Build signal driving self.add_drive("x_sti <= x;") self.add_drive("y_sti <= y;") # Build compare self.add_compare("if (z_obs /= z) then") self.add_compare(" logger.log_error( LF &") self.add_compare( " \"Error: transaction number \" & integer'image(op_count) & \" on\" & \"<BR>\" & LF &" ) self.add_compare( " \"x : \" & to_hstring(x_sti) & \"<BR>\" & LF &") self.add_compare( " \"y : \" & to_hstring(y_sti) & \"<BR>\" & LF &") self.add_compare( " \"yield : \" & to_string(z_obs) & \"<BR>\" & LF &") self.add_compare( " \"should be: \" & to_string(z) & \"<BR>\" & LF &") self.add_compare( " \"took \" & integer'image(cycle) & \" cycles\"") self.add_compare(" );") self.add_compare("else") self.add_compare(" logger.log_note( LF &") self.add_compare( " \"Transaction number \" & integer'image(op_count) & \" on\" & \"<BR>\" & LF &" ) self.add_compare( " \"x : \" & to_hstring(x_sti) & \"<BR>\" & LF &") self.add_compare( " \"y : \" & to_hstring(y_sti) & \"<BR>\" & LF &") self.add_compare( " \"yield : \" & to_string(z_obs) & \"<BR>\" & LF &") self.add_compare( " \"took \" & integer'image(cycle) & \" cycles\"") self.add_compare(" );") self.add_compare("end if;") self.add_action("-- Testbench actions") self.add_action("") self.add_action("-- " + str(op_count) + " reduction of random " + str(2 * dp.p.nbits()) + " bits elements") for i in range(op_count): x = randrange(2**(2 * dp.p.nbits()) - 1) z = mod(x, dp.p) self.add_action("func(" + str(2 * dp.p.nbits()) + "X\"" + Integer(x).str(base=16) + "\", -- x_sti") self.add_action(" " + str(dp.p.nbits()) + "X\"" + Integer(dp.p).str(base=16) + "\", -- y_sti (modulus)") self.add_action(" " + str(dp.p.nbits()) + "X\"" + Integer(z).str(base=16) + "\"); -- z_ref") self.add_action("") self.add_action("-- Testbench actions end")