示例#1
0
    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
示例#2
0
    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])
示例#3
0
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
示例#4
0
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
示例#5
0
    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")