Module garoupa.algebra.npmath

Operations using numpy

Expand source code
#  Copyright (c) 2021. Davi Pereira dos Santos
#  This file is part of the garoupa project.
#  Please respect the license - more about this in the section (*) below.
#
#  garoupa is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  garoupa is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with garoupa.  If not, see <http://www.gnu.org/licenses/>.
#
#  (*) Removing authorship by any means, e.g. by distribution of derived
#  works or verbatim, obfuscated, compiled or rewritten versions of any
#  part of this work is illegal and is unethical regarding the effort and
#  time spent here.
"""Operations using numpy"""
import numpy as np


def bytes2bm(bs):
    m = np.eye(17)
    m[0, 1] = float(bs[15] & 1)
    m[0, 2] = float(bs[15] >> 1 & 1)
    m[0, 3] = float(bs[15] >> 2 & 1)
    m[0, 5] = float(bs[15] >> 3 & 1)
    m[0, 6] = float(bs[15] >> 4 & 1)
    m[0, 7] = float(bs[15] >> 5 & 1)
    m[0, 8] = float(bs[15] >> 6 & 1)
    m[0, 9] = float(bs[15] >> 7 & 1)
    m[0, 10] = float(bs[14] & 1)
    m[0, 11] = float(bs[14] >> 1 & 1)
    m[0, 12] = float(bs[14] >> 2 & 1)
    m[0, 13] = float(bs[14] >> 3 & 1)
    m[0, 14] = float(bs[14] >> 4 & 1)
    m[0, 15] = float(bs[14] >> 5 & 1)
    m[0, 16] = float(bs[14] >> 6 & 1)
    m[1, 2] = float(bs[14] >> 7 & 1)
    m[1, 3] = float(bs[13] & 1)
    m[1, 5] = float(bs[13] >> 1 & 1)
    m[1, 6] = float(bs[13] >> 2 & 1)
    m[1, 7] = float(bs[13] >> 3 & 1)
    m[1, 8] = float(bs[13] >> 4 & 1)
    m[1, 9] = float(bs[13] >> 5 & 1)
    m[1, 10] = float(bs[13] >> 6 & 1)
    m[1, 11] = float(bs[13] >> 7 & 1)
    m[1, 12] = float(bs[12] & 1)
    m[1, 13] = float(bs[12] >> 1 & 1)
    m[1, 14] = float(bs[12] >> 2 & 1)
    m[1, 15] = float(bs[12] >> 3 & 1)
    m[1, 16] = float(bs[12] >> 4 & 1)
    m[2, 3] = float(bs[12] >> 5 & 1)
    m[2, 5] = float(bs[12] >> 6 & 1)
    m[2, 6] = float(bs[12] >> 7 & 1)
    m[2, 7] = float(bs[11] & 1)
    m[2, 8] = float(bs[11] >> 1 & 1)
    m[2, 9] = float(bs[11] >> 2 & 1)
    m[2, 10] = float(bs[11] >> 3 & 1)
    m[2, 11] = float(bs[11] >> 4 & 1)
    m[2, 12] = float(bs[11] >> 5 & 1)
    m[2, 13] = float(bs[11] >> 6 & 1)
    m[2, 14] = float(bs[11] >> 7 & 1)
    m[2, 15] = float(bs[10] & 1)
    m[2, 16] = float(bs[10] >> 1 & 1)
    m[3, 5] = float(bs[10] >> 2 & 1)
    m[3, 6] = float(bs[10] >> 3 & 1)
    m[3, 7] = float(bs[10] >> 4 & 1)
    m[3, 8] = float(bs[10] >> 5 & 1)
    m[3, 9] = float(bs[10] >> 6 & 1)
    m[3, 10] = float(bs[10] >> 7 & 1)
    m[3, 11] = float(bs[9] & 1)
    m[3, 12] = float(bs[9] >> 1 & 1)
    m[3, 13] = float(bs[9] >> 2 & 1)
    m[3, 14] = float(bs[9] >> 3 & 1)
    m[3, 15] = float(bs[9] >> 4 & 1)
    m[3, 16] = float(bs[9] >> 5 & 1)
    m[4, 5] = float(bs[9] >> 6 & 1)
    m[4, 6] = float(bs[9] >> 7 & 1)
    m[4, 7] = float(bs[8] & 1)
    m[4, 8] = float(bs[8] >> 1 & 1)
    m[4, 9] = float(bs[8] >> 2 & 1)
    m[4, 10] = float(bs[8] >> 3 & 1)
    m[4, 11] = float(bs[8] >> 4 & 1)
    m[4, 12] = float(bs[8] >> 5 & 1)
    m[4, 13] = float(bs[8] >> 6 & 1)
    m[4, 14] = float(bs[8] >> 7 & 1)
    m[4, 15] = float(bs[7] & 1)
    m[4, 16] = float(bs[7] >> 1 & 1)
    m[5, 6] = float(bs[7] >> 2 & 1)
    m[5, 7] = float(bs[7] >> 3 & 1)
    m[5, 8] = float(bs[7] >> 4 & 1)
    m[5, 9] = float(bs[7] >> 5 & 1)
    m[5, 10] = float(bs[7] >> 6 & 1)
    m[5, 11] = float(bs[7] >> 7 & 1)
    m[5, 12] = float(bs[6] & 1)
    m[5, 13] = float(bs[6] >> 1 & 1)
    m[5, 14] = float(bs[6] >> 2 & 1)
    m[5, 15] = float(bs[6] >> 3 & 1)
    m[5, 16] = float(bs[6] >> 4 & 1)
    m[6, 7] = float(bs[6] >> 5 & 1)
    m[6, 8] = float(bs[6] >> 6 & 1)
    m[6, 9] = float(bs[6] >> 7 & 1)
    m[6, 10] = float(bs[5] & 1)
    m[6, 11] = float(bs[5] >> 1 & 1)
    m[6, 12] = float(bs[5] >> 2 & 1)
    m[6, 13] = float(bs[5] >> 3 & 1)
    m[6, 14] = float(bs[5] >> 4 & 1)
    m[6, 15] = float(bs[5] >> 5 & 1)
    m[6, 16] = float(bs[5] >> 6 & 1)
    m[7, 8] = float(bs[5] >> 7 & 1)
    m[7, 9] = float(bs[4] & 1)
    m[7, 10] = float(bs[4] >> 1 & 1)
    m[7, 11] = float(bs[4] >> 2 & 1)
    m[7, 12] = float(bs[4] >> 3 & 1)
    m[7, 13] = float(bs[4] >> 4 & 1)
    m[7, 14] = float(bs[4] >> 5 & 1)
    m[7, 15] = float(bs[4] >> 6 & 1)
    m[7, 16] = float(bs[4] >> 7 & 1)
    m[8, 9] = float(bs[3] & 1)
    m[8, 10] = float(bs[3] >> 1 & 1)
    m[8, 11] = float(bs[3] >> 2 & 1)
    m[8, 12] = float(bs[3] >> 3 & 1)
    m[8, 13] = float(bs[3] >> 4 & 1)
    m[8, 14] = float(bs[3] >> 5 & 1)
    m[8, 15] = float(bs[3] >> 6 & 1)
    m[8, 16] = float(bs[3] >> 7 & 1)
    m[9, 10] = float(bs[2] & 1)
    m[9, 11] = float(bs[2] >> 1 & 1)
    m[9, 12] = float(bs[2] >> 2 & 1)
    m[9, 13] = float(bs[2] >> 3 & 1)
    m[9, 14] = float(bs[2] >> 4 & 1)
    m[9, 15] = float(bs[2] >> 5 & 1)
    m[9, 16] = float(bs[2] >> 6 & 1)
    m[10, 11] = float(bs[2] >> 7 & 1)
    m[10, 12] = float(bs[1] & 1)
    m[10, 13] = float(bs[1] >> 1 & 1)
    m[10, 14] = float(bs[1] >> 2 & 1)
    m[10, 15] = float(bs[1] >> 3 & 1)
    m[10, 16] = float(bs[1] >> 4 & 1)
    m[11, 12] = float(bs[1] >> 5 & 1)
    m[11, 13] = float(bs[1] >> 6 & 1)
    m[11, 14] = float(bs[1] >> 7 & 1)
    m[11, 15] = float(bs[0] & 1)
    m[11, 16] = float(bs[0] >> 1 & 1)
    m[13, 14] = float(bs[0] >> 2 & 1)
    m[13, 15] = float(bs[0] >> 3 & 1)
    m[13, 16] = float(bs[0] >> 4 & 1)
    m[14, 15] = float(bs[0] >> 5 & 1)
    m[14, 16] = float(bs[0] >> 6 & 1)
    m[15, 16] = float(bs[0] >> 7 & 1)
    return m


def int2bm(n):
    return bytes2bm(n.to_bytes(16, byteorder="big"))


def bmm(a, b, mod):
    """unitriangular matrix (modulo) multiplication"""
    return (a @ b) % mod


def bm2int(m):
    n = 0
    b = 0
    for i in range(12):
        if i < 3:
            for j in range(i + 1, 4):
                n += int(m[i, j]) << b
                b += 1
        for j in range(max(5, i + 1), 17):
            n += int(m[i, j]) << b
            b += 1
    for i in range(13, 17):
        for j in range(max(12, i + 1), 17):
            n += int(m[i, j]) << b
            b += 1
    return n


def bminv(m):
    return np.uint8(np.linalg.inv(m) % 2)


def int2bm6(n):
    m = np.eye(6)
    m[0, 1] = float(n >> 14 & 1)
    m[0, 2] = float(n >> 13 & 1)
    m[0, 3] = float(n >> 12 & 1)
    m[0, 4] = float(n >> 11 & 1)
    m[0, 5] = float(n >> 10 & 1)

    m[1, 2] = float(n >> 9 & 1)
    m[1, 3] = float(n >> 8 & 1)
    m[1, 4] = float(n >> 7 & 1)
    m[1, 5] = float(n >> 6 & 1)

    m[2, 3] = float(n >> 5 & 1)
    m[2, 4] = float(n >> 4 & 1)
    m[2, 5] = float(n >> 3 & 1)

    m[3, 4] = float(n >> 2 & 1)
    m[3, 5] = float(n >> 1 & 1)

    m[4, 5] = float(n & 1)
    return m


def bm2int6(m):
    n = (int(m[0, 1]) << 14) + (int(m[0, 2]) << 13) + (int(m[0, 3]) << 12) + (int(m[0, 4]) << 11) + (int(m[0, 5]) << 10)
    n += (int(m[1, 2]) << 9) + (int(m[1, 3]) << 8) + (int(m[1, 4]) << 7) + (int(m[1, 5]) << 6)
    n += (int(m[2, 3]) << 5) + (int(m[2, 4]) << 4) + (int(m[2, 5]) << 3)
    n += (int(m[3, 4]) << 2) + (int(m[3, 5]) << 1)
    n += int(m[4, 5])
    return n


def int2bm8bit(n):
    m = np.eye(5)
    m[0, 2] = float(n >> 7 & 1)
    m[0, 3] = float(n >> 6 & 1)
    m[0, 4] = float(n >> 5 & 1)

    m[1, 2] = float(n >> 4 & 1)
    m[1, 3] = float(n >> 3 & 1)
    m[1, 4] = float(n >> 2 & 1)

    m[2, 3] = float(n >> 1 & 1)
    m[2, 4] = float(n & 1)
    return m


def bm2int8bit(m):
    n = (int(m[0, 2]) << 7) + (int(m[0, 3]) << 6) + (int(m[0, 4]) << 5)
    n += (int(m[1, 2]) << 4) + (int(m[1, 3]) << 3) + (int(m[1, 4]) << 2)
    n += (int(m[2, 3]) << 1) + int(m[2, 4])
    return n


def int2bml(n, l, bits):
    m = np.eye(l)
    b = bits - 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            m[i, j] = float(n >> b & 1)
            b -= 1
    return m


def bm2intl(m, bits):
    n = 0
    l = len(m)
    b = bits - 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) << b
            b -= 1
    return n


def int2ml(n, o, l):
    """
    Usage:

    >>> from numpy import uint64
    >>> int2ml(4095, 4, 5)
    array([[1, 3, 3, 3, 3],
           [0, 1, 3, 3, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]], dtype=uint64)
    """
    m = np.eye(l, dtype=np.uint64)
    for i in range(l - 1):
        for j in range(i + 1, l):
            n, rem = divmod(n, o)
            m[i, j] = rem
    return m


def m2intl(m, o):
    """
    Usage:

    >>> from numpy import array, uint8
    >>> m = array([[1, 3, 3, 3, 3],
    ...            [0, 1, 3, 3, 0],
    ...            [0, 0, 1, 0, 0],
    ...            [0, 0, 0, 1, 0],
    ...            [0, 0, 0, 0, 1]], dtype=np.uint64)
    >>> m2intl(m, 4)
    4095
    """
    n = 0
    l = len(m)
    exp = 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) * exp
            exp *= o
    return n


#########################################
#########################################
#########################################


def m4m(a, b, mod):
    """unitriangular matrix (modulo) multiplication"""
    return (a @ b) % mod


def m42int(m, o):
    """
    Usage:

    >>> from numpy import array, uint8
    >>> m = array([[1, 3, 3, 3, 3],
    ...            [0, 1, 3, 3, 0],
    ...            [0, 0, 1, 0, 0],
    ...            [0, 0, 0, 1, 0],
    ...            [0, 0, 0, 0, 1]], dtype=np.uint64)
    >>> m42int(m, 4)
    4095
    """
    n = 0
    l = len(m)
    exp = 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) * exp
            exp *= o
    return n


def int2m4(n, o, l=4):
    """
    Usage:

    >>> int2m4(4095, 4, 5)
    array([[1, 3, 3, 3, 3],
           [0, 1, 3, 3, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]], dtype=uint64)
    """
    m = np.eye(l, dtype=np.uint64)
    for i in range(l - 1):
        for j in range(i + 1, l):
            n, rem = divmod(n, o)
            m[i, j] = rem
    return m


def m4inv(m, o):
    # if o < 257:
    #     return np.uint8(np.linalg.inv(m) % o)
    return np.linalg.inv(m) % o

Functions

def bm2int(m)
Expand source code
def bm2int(m):
    n = 0
    b = 0
    for i in range(12):
        if i < 3:
            for j in range(i + 1, 4):
                n += int(m[i, j]) << b
                b += 1
        for j in range(max(5, i + 1), 17):
            n += int(m[i, j]) << b
            b += 1
    for i in range(13, 17):
        for j in range(max(12, i + 1), 17):
            n += int(m[i, j]) << b
            b += 1
    return n
def bm2int6(m)
Expand source code
def bm2int6(m):
    n = (int(m[0, 1]) << 14) + (int(m[0, 2]) << 13) + (int(m[0, 3]) << 12) + (int(m[0, 4]) << 11) + (int(m[0, 5]) << 10)
    n += (int(m[1, 2]) << 9) + (int(m[1, 3]) << 8) + (int(m[1, 4]) << 7) + (int(m[1, 5]) << 6)
    n += (int(m[2, 3]) << 5) + (int(m[2, 4]) << 4) + (int(m[2, 5]) << 3)
    n += (int(m[3, 4]) << 2) + (int(m[3, 5]) << 1)
    n += int(m[4, 5])
    return n
def bm2int8bit(m)
Expand source code
def bm2int8bit(m):
    n = (int(m[0, 2]) << 7) + (int(m[0, 3]) << 6) + (int(m[0, 4]) << 5)
    n += (int(m[1, 2]) << 4) + (int(m[1, 3]) << 3) + (int(m[1, 4]) << 2)
    n += (int(m[2, 3]) << 1) + int(m[2, 4])
    return n
def bm2intl(m, bits)
Expand source code
def bm2intl(m, bits):
    n = 0
    l = len(m)
    b = bits - 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) << b
            b -= 1
    return n
def bminv(m)
Expand source code
def bminv(m):
    return np.uint8(np.linalg.inv(m) % 2)
def bmm(a, b, mod)

unitriangular matrix (modulo) multiplication

Expand source code
def bmm(a, b, mod):
    """unitriangular matrix (modulo) multiplication"""
    return (a @ b) % mod
def bytes2bm(bs)
Expand source code
def bytes2bm(bs):
    m = np.eye(17)
    m[0, 1] = float(bs[15] & 1)
    m[0, 2] = float(bs[15] >> 1 & 1)
    m[0, 3] = float(bs[15] >> 2 & 1)
    m[0, 5] = float(bs[15] >> 3 & 1)
    m[0, 6] = float(bs[15] >> 4 & 1)
    m[0, 7] = float(bs[15] >> 5 & 1)
    m[0, 8] = float(bs[15] >> 6 & 1)
    m[0, 9] = float(bs[15] >> 7 & 1)
    m[0, 10] = float(bs[14] & 1)
    m[0, 11] = float(bs[14] >> 1 & 1)
    m[0, 12] = float(bs[14] >> 2 & 1)
    m[0, 13] = float(bs[14] >> 3 & 1)
    m[0, 14] = float(bs[14] >> 4 & 1)
    m[0, 15] = float(bs[14] >> 5 & 1)
    m[0, 16] = float(bs[14] >> 6 & 1)
    m[1, 2] = float(bs[14] >> 7 & 1)
    m[1, 3] = float(bs[13] & 1)
    m[1, 5] = float(bs[13] >> 1 & 1)
    m[1, 6] = float(bs[13] >> 2 & 1)
    m[1, 7] = float(bs[13] >> 3 & 1)
    m[1, 8] = float(bs[13] >> 4 & 1)
    m[1, 9] = float(bs[13] >> 5 & 1)
    m[1, 10] = float(bs[13] >> 6 & 1)
    m[1, 11] = float(bs[13] >> 7 & 1)
    m[1, 12] = float(bs[12] & 1)
    m[1, 13] = float(bs[12] >> 1 & 1)
    m[1, 14] = float(bs[12] >> 2 & 1)
    m[1, 15] = float(bs[12] >> 3 & 1)
    m[1, 16] = float(bs[12] >> 4 & 1)
    m[2, 3] = float(bs[12] >> 5 & 1)
    m[2, 5] = float(bs[12] >> 6 & 1)
    m[2, 6] = float(bs[12] >> 7 & 1)
    m[2, 7] = float(bs[11] & 1)
    m[2, 8] = float(bs[11] >> 1 & 1)
    m[2, 9] = float(bs[11] >> 2 & 1)
    m[2, 10] = float(bs[11] >> 3 & 1)
    m[2, 11] = float(bs[11] >> 4 & 1)
    m[2, 12] = float(bs[11] >> 5 & 1)
    m[2, 13] = float(bs[11] >> 6 & 1)
    m[2, 14] = float(bs[11] >> 7 & 1)
    m[2, 15] = float(bs[10] & 1)
    m[2, 16] = float(bs[10] >> 1 & 1)
    m[3, 5] = float(bs[10] >> 2 & 1)
    m[3, 6] = float(bs[10] >> 3 & 1)
    m[3, 7] = float(bs[10] >> 4 & 1)
    m[3, 8] = float(bs[10] >> 5 & 1)
    m[3, 9] = float(bs[10] >> 6 & 1)
    m[3, 10] = float(bs[10] >> 7 & 1)
    m[3, 11] = float(bs[9] & 1)
    m[3, 12] = float(bs[9] >> 1 & 1)
    m[3, 13] = float(bs[9] >> 2 & 1)
    m[3, 14] = float(bs[9] >> 3 & 1)
    m[3, 15] = float(bs[9] >> 4 & 1)
    m[3, 16] = float(bs[9] >> 5 & 1)
    m[4, 5] = float(bs[9] >> 6 & 1)
    m[4, 6] = float(bs[9] >> 7 & 1)
    m[4, 7] = float(bs[8] & 1)
    m[4, 8] = float(bs[8] >> 1 & 1)
    m[4, 9] = float(bs[8] >> 2 & 1)
    m[4, 10] = float(bs[8] >> 3 & 1)
    m[4, 11] = float(bs[8] >> 4 & 1)
    m[4, 12] = float(bs[8] >> 5 & 1)
    m[4, 13] = float(bs[8] >> 6 & 1)
    m[4, 14] = float(bs[8] >> 7 & 1)
    m[4, 15] = float(bs[7] & 1)
    m[4, 16] = float(bs[7] >> 1 & 1)
    m[5, 6] = float(bs[7] >> 2 & 1)
    m[5, 7] = float(bs[7] >> 3 & 1)
    m[5, 8] = float(bs[7] >> 4 & 1)
    m[5, 9] = float(bs[7] >> 5 & 1)
    m[5, 10] = float(bs[7] >> 6 & 1)
    m[5, 11] = float(bs[7] >> 7 & 1)
    m[5, 12] = float(bs[6] & 1)
    m[5, 13] = float(bs[6] >> 1 & 1)
    m[5, 14] = float(bs[6] >> 2 & 1)
    m[5, 15] = float(bs[6] >> 3 & 1)
    m[5, 16] = float(bs[6] >> 4 & 1)
    m[6, 7] = float(bs[6] >> 5 & 1)
    m[6, 8] = float(bs[6] >> 6 & 1)
    m[6, 9] = float(bs[6] >> 7 & 1)
    m[6, 10] = float(bs[5] & 1)
    m[6, 11] = float(bs[5] >> 1 & 1)
    m[6, 12] = float(bs[5] >> 2 & 1)
    m[6, 13] = float(bs[5] >> 3 & 1)
    m[6, 14] = float(bs[5] >> 4 & 1)
    m[6, 15] = float(bs[5] >> 5 & 1)
    m[6, 16] = float(bs[5] >> 6 & 1)
    m[7, 8] = float(bs[5] >> 7 & 1)
    m[7, 9] = float(bs[4] & 1)
    m[7, 10] = float(bs[4] >> 1 & 1)
    m[7, 11] = float(bs[4] >> 2 & 1)
    m[7, 12] = float(bs[4] >> 3 & 1)
    m[7, 13] = float(bs[4] >> 4 & 1)
    m[7, 14] = float(bs[4] >> 5 & 1)
    m[7, 15] = float(bs[4] >> 6 & 1)
    m[7, 16] = float(bs[4] >> 7 & 1)
    m[8, 9] = float(bs[3] & 1)
    m[8, 10] = float(bs[3] >> 1 & 1)
    m[8, 11] = float(bs[3] >> 2 & 1)
    m[8, 12] = float(bs[3] >> 3 & 1)
    m[8, 13] = float(bs[3] >> 4 & 1)
    m[8, 14] = float(bs[3] >> 5 & 1)
    m[8, 15] = float(bs[3] >> 6 & 1)
    m[8, 16] = float(bs[3] >> 7 & 1)
    m[9, 10] = float(bs[2] & 1)
    m[9, 11] = float(bs[2] >> 1 & 1)
    m[9, 12] = float(bs[2] >> 2 & 1)
    m[9, 13] = float(bs[2] >> 3 & 1)
    m[9, 14] = float(bs[2] >> 4 & 1)
    m[9, 15] = float(bs[2] >> 5 & 1)
    m[9, 16] = float(bs[2] >> 6 & 1)
    m[10, 11] = float(bs[2] >> 7 & 1)
    m[10, 12] = float(bs[1] & 1)
    m[10, 13] = float(bs[1] >> 1 & 1)
    m[10, 14] = float(bs[1] >> 2 & 1)
    m[10, 15] = float(bs[1] >> 3 & 1)
    m[10, 16] = float(bs[1] >> 4 & 1)
    m[11, 12] = float(bs[1] >> 5 & 1)
    m[11, 13] = float(bs[1] >> 6 & 1)
    m[11, 14] = float(bs[1] >> 7 & 1)
    m[11, 15] = float(bs[0] & 1)
    m[11, 16] = float(bs[0] >> 1 & 1)
    m[13, 14] = float(bs[0] >> 2 & 1)
    m[13, 15] = float(bs[0] >> 3 & 1)
    m[13, 16] = float(bs[0] >> 4 & 1)
    m[14, 15] = float(bs[0] >> 5 & 1)
    m[14, 16] = float(bs[0] >> 6 & 1)
    m[15, 16] = float(bs[0] >> 7 & 1)
    return m
def int2bm(n)
Expand source code
def int2bm(n):
    return bytes2bm(n.to_bytes(16, byteorder="big"))
def int2bm6(n)
Expand source code
def int2bm6(n):
    m = np.eye(6)
    m[0, 1] = float(n >> 14 & 1)
    m[0, 2] = float(n >> 13 & 1)
    m[0, 3] = float(n >> 12 & 1)
    m[0, 4] = float(n >> 11 & 1)
    m[0, 5] = float(n >> 10 & 1)

    m[1, 2] = float(n >> 9 & 1)
    m[1, 3] = float(n >> 8 & 1)
    m[1, 4] = float(n >> 7 & 1)
    m[1, 5] = float(n >> 6 & 1)

    m[2, 3] = float(n >> 5 & 1)
    m[2, 4] = float(n >> 4 & 1)
    m[2, 5] = float(n >> 3 & 1)

    m[3, 4] = float(n >> 2 & 1)
    m[3, 5] = float(n >> 1 & 1)

    m[4, 5] = float(n & 1)
    return m
def int2bm8bit(n)
Expand source code
def int2bm8bit(n):
    m = np.eye(5)
    m[0, 2] = float(n >> 7 & 1)
    m[0, 3] = float(n >> 6 & 1)
    m[0, 4] = float(n >> 5 & 1)

    m[1, 2] = float(n >> 4 & 1)
    m[1, 3] = float(n >> 3 & 1)
    m[1, 4] = float(n >> 2 & 1)

    m[2, 3] = float(n >> 1 & 1)
    m[2, 4] = float(n & 1)
    return m
def int2bml(n, l, bits)
Expand source code
def int2bml(n, l, bits):
    m = np.eye(l)
    b = bits - 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            m[i, j] = float(n >> b & 1)
            b -= 1
    return m
def int2m4(n, o, l=4)

Usage:

>>> int2m4(4095, 4, 5)
array([[1, 3, 3, 3, 3],
       [0, 1, 3, 3, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]], dtype=uint64)
Expand source code
def int2m4(n, o, l=4):
    """
    Usage:

    >>> int2m4(4095, 4, 5)
    array([[1, 3, 3, 3, 3],
           [0, 1, 3, 3, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]], dtype=uint64)
    """
    m = np.eye(l, dtype=np.uint64)
    for i in range(l - 1):
        for j in range(i + 1, l):
            n, rem = divmod(n, o)
            m[i, j] = rem
    return m
def int2ml(n, o, l)

Usage:

>>> from numpy import uint64
>>> int2ml(4095, 4, 5)
array([[1, 3, 3, 3, 3],
       [0, 1, 3, 3, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]], dtype=uint64)
Expand source code
def int2ml(n, o, l):
    """
    Usage:

    >>> from numpy import uint64
    >>> int2ml(4095, 4, 5)
    array([[1, 3, 3, 3, 3],
           [0, 1, 3, 3, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]], dtype=uint64)
    """
    m = np.eye(l, dtype=np.uint64)
    for i in range(l - 1):
        for j in range(i + 1, l):
            n, rem = divmod(n, o)
            m[i, j] = rem
    return m
def m2intl(m, o)

Usage:

>>> from numpy import array, uint8
>>> m = array([[1, 3, 3, 3, 3],
...            [0, 1, 3, 3, 0],
...            [0, 0, 1, 0, 0],
...            [0, 0, 0, 1, 0],
...            [0, 0, 0, 0, 1]], dtype=np.uint64)
>>> m2intl(m, 4)
4095
Expand source code
def m2intl(m, o):
    """
    Usage:

    >>> from numpy import array, uint8
    >>> m = array([[1, 3, 3, 3, 3],
    ...            [0, 1, 3, 3, 0],
    ...            [0, 0, 1, 0, 0],
    ...            [0, 0, 0, 1, 0],
    ...            [0, 0, 0, 0, 1]], dtype=np.uint64)
    >>> m2intl(m, 4)
    4095
    """
    n = 0
    l = len(m)
    exp = 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) * exp
            exp *= o
    return n
def m42int(m, o)

Usage:

>>> from numpy import array, uint8
>>> m = array([[1, 3, 3, 3, 3],
...            [0, 1, 3, 3, 0],
...            [0, 0, 1, 0, 0],
...            [0, 0, 0, 1, 0],
...            [0, 0, 0, 0, 1]], dtype=np.uint64)
>>> m42int(m, 4)
4095
Expand source code
def m42int(m, o):
    """
    Usage:

    >>> from numpy import array, uint8
    >>> m = array([[1, 3, 3, 3, 3],
    ...            [0, 1, 3, 3, 0],
    ...            [0, 0, 1, 0, 0],
    ...            [0, 0, 0, 1, 0],
    ...            [0, 0, 0, 0, 1]], dtype=np.uint64)
    >>> m42int(m, 4)
    4095
    """
    n = 0
    l = len(m)
    exp = 1
    for i in range(l - 1):
        for j in range(i + 1, l):
            n += int(m[i, j]) * exp
            exp *= o
    return n
def m4inv(m, o)
Expand source code
def m4inv(m, o):
    # if o < 257:
    #     return np.uint8(np.linalg.inv(m) % o)
    return np.linalg.inv(m) % o
def m4m(a, b, mod)

unitriangular matrix (modulo) multiplication

Expand source code
def m4m(a, b, mod):
    """unitriangular matrix (modulo) multiplication"""
    return (a @ b) % mod