def display_norm_A(axis):
    """Display additional information of a 2A axis

    
    """
    #sample_axes = import_sample_axes()

    norm_A = axis.norm15
    s = "norm(A) = %d (mod 15)" % (norm_A)
    common = [
        a.g_class for a in get_axes().values()
        if a.norm15 == norm_A and a.g_class != axis.g_class
    ]
    if len(common) == 0:
        return s + "\n"
    s += ", same norm for class " + " and ".join(map(str, common))
    d = 2 if norm_A == 4 else 0
    V15 = MMV(15)
    v = axis.v15
    r = mm_op15_eval_A_rank_mod3(v.data, d)
    rank = r >> 48
    v3 = r & 0xffffffffffff
    s_A = "(A - %d * 1)" % d if d else "A"
    s += "\nMatrix U = %s (mod 3) has rank %d" % (s_A, rank)
    if (rank != 23):
        return s + "\n"
    v2 = gen_leech3to2_short(v3)
    if v2:
        f = "Kernel of U is spanned by a short vector v with A(v) ="
        a2 = mm_op15_eval_A(v.data, v2)
        s += "\n%s %d (mod 15)" % (f, a2)
    if gen_leech3to2_type4(v3):
        f = "Kernel of U is spanned by a vector of type 4"
        s += "\n" + f
    return s + "\n"
Exemple #2
0
def test_mul(ncases=20):
    vtest = MMV(127)('R')
    indices, glist = make_mul_samples()
    for n in range(ncases):
        i, j = sample(indices, 2)
        vt1 = vtest * glist[i] * glist[j]
        glist[i] *= glist[j]
        vt2 = vtest * glist[i]
        assert vt1 == vt2
Exemple #3
0
def test_mul_MM():
    print("Test multiplcation in monster group in class MM")
    V = MMV(3)
    for g1 in mul_testcases():
        v = V("R")
        for g2 in mul_testcases():
            v1 = (v * g1) * g2
            v2 = v * (g1 * g2)
            assert v1 == v2
Exemple #4
0
def kernel_testmatrix(p, tags="dxypt" * 3, diag=0):
    space = MMV(p)
    a = space()
    diag %= 3
    for i in range(24):
        d = diag + randint(1, 2) + 3 * randint(0, 4)
        a['A', i, i] = d % p if i else diag
    # Now ``a`` encodes the tag A part of the rep of the monster mod p
    # It encodes a symmetric matrix with kernel :math:`\Omega`.
    v3 = 1  # \Omega in Leech lattice mod 3 encoding
    g = MM0([(t, 'r') for t in tags])
    a.ops.op_word_tag_A(a.data, g.mmdata, len(g.mmdata), 1)
    v3_kernel = gen_leech3_op_vector_word(v3, g.mmdata, len(g.mmdata))
    return a, v3_kernel
def norm_A_mod15(i):
    """Return norm(A) mod 15 for entry i in the list in sample_axes.py

    The lists in file sample_axes.py refer to a collection of 12-axes 
    of different types.
   
    """
    global norms_A_mod15
    try:
        return norms_A_mod15[i]
    except:
        norms_A_mod15 = []
        sample_axes = import_sample_axes()
        V15 = MMV(15)
        for g in sample_axes.g_strings:
            v = v_axis * MM0(g)
            norms_A_mod15.append(mm_op15_norm_A(v.data))
        return norms_A_mod15[i]
Exemple #6
0
def display_norm_A(i):
    """Display additional information of a 2A axis

    
    """
    sample_axes = import_sample_axes()

    if isinstance(i, str): i = axis_index(i)
    norm_A = norm_A_mod15(i)
    s = "norm(A) = %d (mod 15)" % (norm_A)
    common = [
        s for j, s in enumerate(sample_axes.g_classes)
        if norm_A_mod15(j) == norm_A and j != i
    ]
    if len(common) == 0:
        return s + "\n"
    s += ", same norm for class " + " and ".join(map(str, common))
    d = 2 if norm_A == 4 else 0
    V15 = MMV(15)
    v = V15(sample_axes.v_start) * MM0(sample_axes.g_strings[i])
    r = mm_op15_eval_A_rank_mod3(v.data, d)
    rank = r >> 48
    v3 = r & 0xffffffffffff
    s_A = "(A - %d * 1)" % d if d else "A"
    s += "\nMatrix U = %s (mod 3) has rank %d" % (s_A, rank)
    if (rank != 23):
        return s + "\n"
    v2 = gen_leech3to2_short(v3)
    if v2:
        f = "Kernel of U is spanned by a short vector v with A(v) ="
        a2 = mm_op15_eval_A(v.data, v2)
        s += "\n%s %d (mod 15)" % (f, a2)
    if gen_leech3to2_type4(v3):
        f = "Kernel of U is spanned by a vector of type 4"
        s += "\n" + f
    return s + "\n"
                    print(s % n)
                return result
        n += chunksize
        if verbose:
            print("\r%5d candidates tested   " % n, end="")
    if verbose:
        print("\n")
    err = "No suitable candidate found"
    raise ValueError(err)


#######################################################################
# Find an element of the monster of a given order
#######################################################################

MMV3 = MMV(3)
MMV15 = MMV(15)


def get_factors(n):
    """Return sorted list of factors of n, for n <= 120"""
    assert 1 <= n < 121, "Number too large"
    return [i for i in range(1, n + 1) if n % i == 0]


def rand_mm_element(size=1):
    """Return a random element ``g`` of the monster group

    Here ``size`` is a measure for the requested word length. 
    of ``g``. The returned random element is not uniform
    distrbuted. It is just sufficiently random, so that
Exemple #8
0
from __future__ import absolute_import, division, print_function
from __future__ import unicode_literals

import numpy as np
from numbers import Integral
from random import randint, sample

import pytest

from mmgroup import MMV, MM0

ref_space = MMV(3)
ref_group = MM0

from mmgroup.structures import mm_order
#from mmgroup.structures.mm_order import reduce_mm

########################################################################
# Computing the order of a group element using a random vector
########################################################################


def ref_order_random_v(g):
    g1 = ref_group(g)
    v = ref_space("R")
    w = v.copy()
    for i in range(1, 120):
        w = w * g1
        if w == v:
            return i
    err = "Error in computation reference order of group element"
from collections import OrderedDict

import numpy as np
import pytest

from mmgroup import MM0, MMV
from mmgroup.mat24 import MAT24_ORDER
from mmgroup.mm15 import op_word_tag_A
from mmgroup.mm15 import op_watermark_A
from mmgroup.mm15 import op_watermark_A_perm_num

#######################################################################
# Test leech3matrix_watermark and leech3matrix_watermark_perm_num
#######################################################################

MMV15 = MMV(15)
MM = MM0


def one_test_watermark(verbose=0):
    v0 = MMV15('R')
    v = v0.data[:48]
    w0 = np.zeros(24, dtype=np.uint32)
    result = op_watermark_A(v, w0)
    if result < 0:
        return 0
    pi_num = randint(0, MAT24_ORDER - 1)
    TAG_y, TAG_p = 0x40000000, 0x20000000
    y1, y2 = randint(0, 0xfff), randint(0, 0xfff)
    op = np.array([TAG_y + y1, TAG_p + pi_num, TAG_y + y2], dtype=np.uint32)
    op_word_tag_A(v, op, len(op), 1)
Exemple #10
0
from mmgroup.tests.test_axes.get_sample_axes import V_AXIS_OPP
from mmgroup.tests.test_axes.get_sample_axes import g_axis, v_axis
from mmgroup.tests.test_axes.get_sample_axes import g_axis_opp
from mmgroup.tests.test_axes.get_sample_axes import v_axis_opp

from mmgroup.tests.test_axes.get_sample_axes import g_central, GVector
from mmgroup.tests.test_axes.get_sample_axes import next_generation_pool
from mmgroup.tests.test_axes.get_sample_axes import axis_type
########################################################################
########################################################################
# The group and the vector space to be used
########################################################################
########################################################################

G = MM0  # The monster group
V15 = MMV(15)  # Its representation space

PROCESSES = 0

########################################################################
########################################################################
# Obtaining samples of transformed axes
########################################################################
########################################################################

########################################################################
# Generate a random element of Co_2
########################################################################

FIXED_PAIR = [3, 2]
FIXED_TUPLE = ("I", 3, 2)
from __future__ import unicode_literals

import sys
import os
import collections
import re
import warnings
from random import randint, shuffle
import pytest
import numpy as np

from mmgroup import MMSpace, MMGroup, MM0, MMV
from mmgroup.tests.spaces.leech_space import mul24_mmgroup

M = MM0
V = MMV(3)


def check_abs_equal(v, v_ref):
    if (v == v_ref).all():
        return
    if (v == -v_ref).all():
        return
    print("Leech lattice vector expected:")
    print(v_ref)
    print("Leech lattice vector obtained:")
    print(v)
    raise ValueError("Leech vectors are not equal or opposite")


def do_test_leech_variants(v, v_leech):
Exemple #12
0
from __future__ import absolute_import, division, print_function
from __future__ import unicode_literals

from random import randint  #, shuffle, sample

import numpy as np
import pytest

from mmgroup import MM0, MMSpace, Cocode, MMV
from mmgroup.mm import mm_aux_index_extern_to_sparse
from mmgroup.mm import mm_aux_index_leech2_to_sparse
from mmgroup.mm import mm_aux_index_sparse_to_leech2
from mmgroup.mm import mm_aux_index_sparse_to_leech
V = MMV(15)

START_AXIS = ('I', 3, 2)

from mmgroup.tests.test_axes.get_sample_axes import import_sample_axes
sample_axes = import_sample_axes()

from mmgroup.tests.test_axes.test_import import AXES, BABY_AXES
# We have(V(START_AXIS) * MM(AXES[key]).axis_type() == key
# for all kes in the dictionar AXES


@pytest.mark.axes
def test_axes():
    for key in AXES:
        v = V(*START_AXIS) * MM0(AXES[key])
        assert v.axis_type() == key
        for i in range(20):
def bench(p, operation = [], iterations = ITERATIONS, break_g = True):
    v = MMV(p)('R')
    #print(operation)
    g = MM0(operation)
    v.mul_exp(g, iterations, break_g = break_g)
    return v.last_timing, iterations
    return eval(s[copen:cclose + 1])


ClassNames = find_table("Classes")
ClassOrders = [int(s[:-1]) for s in ClassNames]
CharacterValues = find_table("Character")
SizesCentralizers = find_table("Sizes of the centralizers")

assert len(ClassNames) == len(CharacterValues) == len(SizesCentralizers)

################################################################
# Check that monster group elements have coorect orders
################################################################

p = 3
space = MMV(3)
group = MM0

good_mm_orders = set(ClassOrders)

max_mm_order = max(good_mm_orders)


def one_test_mm_order(v, m, verbose=0):
    v = v.copy()
    v1, n = v.copy(), 0
    while n <= max_mm_order:
        v1, n = v1 * m, n + 1
        if v1 == v:
            return n
    return None