Boolean-Cayley-graphs / boolean_cayley_graphs / __pycache__ / boolean_function_improved.cpython-39-pytest-6.2.5.pyc
24930 viewsa
B1�b�_ � @ s� d Z ddlZddlm mZ ddlZddlZddl m
Z
ddlmZ ddl
mZ ddlmZ ddlmZ ddlmZ dd lmZ dd
lmZ ddlmZmZ ddlmZ d
ZG dd� de
e�Z dS )a�
An improved Boolean function class
==================================
The ``boolean_function_improved`` module defines
the ``BooleanFunctionImproved`` class,
which is a subclass of BooleanFunction that adds extra methods.
One such method is ``cayley_graph``,
which returns the Cayley graph of the Boolean function.
AUTHORS:
- Paul Leopardi (2016-08-23): initial version
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf = BooleanFunctionImproved([0,0,0,1])
sage: type(bf)
<class 'boolean_cayley_graphs.boolean_function_improved.BooleanFunctionImproved'>
sage: bf.truth_table(format='int')
(0, 0, 0, 1)
� N)�BooleanFunction)�vector)�FiniteField)�Integer)�ZZ)�boolean_cayley_graph)�BooleanGraph)�boolean_linear_code��base2�inner)�SaveablezUTF-8c @ s� e Zd ZdZedd� �Zedd� �Zedd� �Zdd � Zd
d� Z dd
� Z
dd� Zdd� Zdd� Z
d%dd�Zd&dd�Zdd� Zdd� Zdd� Zd d!� Zd"d#� Zd$S )'�BooleanFunctionImproveda6
A subclass of BooleanFunction that adds extra methods.
The class inherits from BooleanFunction is initialized in the same way.
The class inherits from Saveable to obtain
load_mangled and save_mangled methods.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf1 = BooleanFunctionImproved([0,1,0,0])
sage: type(bf1)
<class 'boolean_cayley_graphs.boolean_function_improved.BooleanFunctionImproved'>
sage: bf1.algebraic_normal_form()
x0*x1 + x0
sage: bf1.truth_table()
(False, True, False, False)
TESTS:
::
sage: from sage.crypto.boolean_function import BooleanFunction
sage: bf = BooleanFunctionImproved([0,1,0,0])
sage: print(bf)
Boolean function with 2 variables
sage: from sage.crypto.boolean_function import BooleanFunction
sage: bf = BooleanFunctionImproved([0,1,0,0])
sage: latex(bf)
\text{\texttt{Boolean{ }function{ }with{ }2{ }variables}}
c C s t t�|�t�}| �||�S )a�
Constructor from the buffer tt_buffer.
The buffer tt_buffer is assumed to be the result of method tt_buffer(),
which returns a result of type buffer representing a truth table in hex.
INPUT:
- ``cls`` -- the class object.
- ``dim`` -- integer: the dimension of the Boolean function.
- ``tt_buffer`` -- buffer: the result of the method tt_buffer()
for the Boolean function.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf2 = BooleanFunctionImproved([0,1,0,0])
sage: bf2_tt_buffer = bf2.tt_buffer()
sage: bf2_test = BooleanFunctionImproved.from_tt_buffer(2, bf2_tt_buffer)
sage: bf2_test.algebraic_normal_form()
x0*x1 + x0
sage: bf2 == bf2_test
True
sage: bf3 = BooleanFunctionImproved([0,1,0,0]*2)
sage: bf3.nvariables()
3
sage: bf3_tt_buffer = bf3.tt_buffer()
sage: bf3_test = BooleanFunctionImproved.from_tt_buffer(3, bf3_tt_buffer)
sage: bf3 == bf3_test
True
)�str�binascii�b2a_hex�encoding�from_tt_hex)�cls�dim� tt_buffer�tt_hex� r �S/home/user/Boolean-Cayley-graphs/boolean_cayley_graphs/boolean_function_improved.py�from_tt_bufferZ s &z&BooleanFunctionImproved.from_tt_bufferc C s8 |dk r,t |d�}d| }t||�}t|�S t|�S dS )a3
Constructor from the dimension dim, and the string tt_hex.
The string tt_hex is assumed to be the result of method tt_hex(), which returns
a string representing a truth table in hex.
INPUT:
- ``cls`` -- the class object.
- ``dim`` -- integer: the dimension of the Boolean function.
- ``tt_hex`` -- string: the result of the method tt_hex() for the Boolean function.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf2 = BooleanFunctionImproved([0,1,0,0])
sage: bf2_tt_hex = bf2.tt_hex()
sage: bf2_test = BooleanFunctionImproved.from_tt_hex(2, bf2_tt_hex)
sage: bf2_test.algebraic_normal_form()
x0*x1 + x0
sage: bf2 == bf2_test
True
TESTS:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf1 = BooleanFunctionImproved([0,1])
sage: bf1_tt_hex = bf1.tt_hex()
sage: bf1_test = BooleanFunctionImproved.from_tt_hex(1, bf1_tt_hex)
sage: bf1_test.algebraic_normal_form()
x
sage: bf1 == bf1_test
True
sage: bf3 = BooleanFunctionImproved([0,1,0,0]*2)
sage: bf3.nvariables()
3
sage: bf3_tt_hex = bf3.tt_hex()
sage: bf3_test = BooleanFunctionImproved.from_tt_hex(3, bf3_tt_hex)
sage: bf3 == bf3_test
True
� � � N)r r r )r r r Z
tt_integer�vZtt_bitsr r r r � s 2
z#BooleanFunctionImproved.from_tt_hexc C sV t |��:}t�|�}t|�}t�t|d �|d �W d � S 1 sH0 Y dS )a4
Constructor from a csv file.
The csv file is assumed to be produced by the method save_as_csv().
INPUT:
- ``cls`` -- the class object.
- ``csv_file_name`` -- string: the name of the csv file to read from.
EXAMPLES:
::
sage: import csv
sage: import os
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf2 = BooleanFunctionImproved([1,0,1,1])
sage: bf2_csv_name = tmp_filename(ext='.csv')
sage: bf2.save_as_csv(bf2_csv_name)
sage: bf2_test = BooleanFunctionImproved.from_csv(bf2_csv_name)
sage: bf2 == bf2_test
True
sage: os.remove(bf2_csv_name)
sage: bf3 = BooleanFunctionImproved([0,1,0,0]*2)
sage: bf3_csv_name = tmp_filename(ext='.csv')
sage: bf3.save_as_csv(bf3_csv_name)
sage: bf3_test = BooleanFunctionImproved.from_csv(bf3_csv_name)
sage: bf3 == bf3_test
True
�
nvariablesr N)�open�csv�
DictReader�nextr r �int)r Z
csv_file_nameZcsv_file�reader�rowr r r �from_csv� s #
�z BooleanFunctionImproved.from_csvc C s t | �}t| �| �S )ag
Return the complement Boolean function of `self`.
INPUT:
- ``self`` -- the current object.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf0 = BooleanFunctionImproved([1,0,1,1])
sage: bf1 = ~bf0
sage: type(bf1)
<class 'boolean_cayley_graphs.boolean_function_improved.BooleanFunctionImproved'>
sage: bf1.algebraic_normal_form()
x0*x1 + x0
sage: bf1.truth_table()
(False, True, False, False)
�r �type)�self�bf_selfr r r �
__invert__� s z"BooleanFunctionImproved.__invert__c C s t | �}t| �|| �S )a�
Return the elementwise sum of `self`and `other` which must have the same number of variables.
INPUT:
- ``self`` -- the current object.
- ``other`` -- another Boolean function.
OUTPUT:
The elementwise sum of `self`and `other`
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf0 = BooleanFunctionImproved([1,0,1,0])
sage: bf1 = BooleanFunctionImproved([1,1,0,0])
sage: (bf0+bf1).truth_table(format='int')
(0, 1, 1, 0)
sage: S = bf0.algebraic_normal_form() + bf1.algebraic_normal_form()
sage: (bf0+bf1).algebraic_normal_form() == S
True
TESTS:
::
sage: bf0+BooleanFunctionImproved([0,1])
Traceback (most recent call last):
...
ValueError: the two Boolean functions must have the same number of variables
r( �r* �otherr+ r r r �__add__ s #zBooleanFunctionImproved.__add__c C s t | �}t| �|| �S )a�
Return the elementwise product of `self`and `other` which must have the same number of variables.
INPUT:
- ``self`` -- the current object.
- ``other`` -- another Boolean function.
OUTPUT:
The elementwise product of `self`and `other`
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf0 = BooleanFunctionImproved([1,0,1,0])
sage: bf1 = BooleanFunctionImproved([1,1,0,0])
sage: (bf0*bf1).truth_table(format='int')
(1, 0, 0, 0)
sage: P = bf0.algebraic_normal_form() * bf1.algebraic_normal_form()
sage: (bf0*bf1).algebraic_normal_form() == P
True
TESTS:
::
sage: bf0*BooleanFunctionImproved([0,1])
Traceback (most recent call last):
...
ValueError: the two Boolean functions must have the same number of variables
r( r- r r r �__mul__- s #zBooleanFunctionImproved.__mul__c C s t | �}t| �||B �S )a�
Return the concatenation of `self` and `other` which must have the same number of variables.
INPUT:
- ``self`` -- the current object.
- ``other`` -- another Boolean function.
OUTPUT:
The concatenation of `self`and `other`
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf0 = BooleanFunctionImproved([1,0,1,0])
sage: bf1 = BooleanFunctionImproved([1,1,0,0])
sage: (bf0|bf1).truth_table(format='int')
(1, 0, 1, 0, 1, 1, 0, 0)
sage: C = bf0.truth_table() + bf1.truth_table()
sage: (bf0|bf1).truth_table(format='int') == C
True
TESTS:
::
sage: bf0|BooleanFunctionImproved([0,1])
Traceback (most recent call last):
...
ValueError: the two Boolean functions must have the same number of variables
r( r- r r r �__or__T s #zBooleanFunctionImproved.__or__c C s | � � }| �� }t||�S )a*
Return the Cayley graph of ``self``.
INPUT:
- ``self`` -- the current object.
OUTPUT:
The Cayley graph of ``self`` as an object of class ``Graph``.
EXAMPLES::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf1 = BooleanFunctionImproved([0,1,0,0])
sage: g1 = bf1.cayley_graph()
sage: g1.adjacency_matrix()
[0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0]
)r �extended_translater �r* r �fr r r �cayley_graph{ s z$BooleanFunctionImproved.cayley_graphc C s | d�r| � � S | � � S )a�
Return the extended Cayley graph of ``self``.
INPUT:
- ``self`` -- the current object.
OUTPUT:
The extended Cayley graph of ``self`` as an object of class ``Graph``.
This is the Cayley graph of ``self`` if ``self(0) == False``,
otherwise it is the Cayley graph of ``~self``.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf1 = BooleanFunctionImproved([0,1,0,0])
sage: g1 = bf1.extended_cayley_graph()
sage: g1.adjacency_matrix()
[0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0]
sage: bf2 = BooleanFunctionImproved([1,0,1,1])
sage: g2 = bf2.extended_cayley_graph()
sage: g2.adjacency_matrix()
[0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0]
r )r5 �r* r r r �extended_cayley_graph� s $��z-BooleanFunctionImproved.extended_cayley_graphr c s �� � �� ����fdd�S )a�
Return an extended translation equivalent function of ``self``.
Given the non-negative numbers `b`, `c` and `d`, the function
`extended_translate` returns the Python function
:math:`x \mapsto \mathtt{self}(x + b) + \langle c, x \rangle + d`,
as decribed below.
INPUT:
- ``self`` -- the current object.
- ``b`` -- non-negative integer (default: 0)
which is mapped to :math:`\mathbb{F}_2^{dim}`.
- ``c`` -- non-negative integer (default: 0).
- ``d`` -- integer, 0 or 1 (default: 0).
OUTPUT:
The Python function
:math:`x \mapsto \mathtt{self}(x + b) + \langle c, x \rangle + d`,
where `b` and `c` are mapped to :math:`\mathbb{F}_2^{dim}` by the
lexicographical ordering implied by the ``base2`` function, and
where ``dim`` is the number of variables of ``self`` as a
``BooleanFunction.``
.. NOTE::
While ``self`` is a ``BooleanFunction``, the result of
``extended_translate`` is *not* a ``BooleanFunction``,
but rather a Python function that takes an ``Integer`` argument.
EXAMPLES:
::
sage: from boolean_cayley_graphs.boolean_function_improved import BooleanFunctionImproved
sage: bf1 = BooleanFunctionImproved([0,1,0,0])
sage: f001 = bf1.extended_translate(b=0,c=0,d=1)
sage: [f001(x) for x in range(4)]
[1, 0, 1, 1]
c s, �t �| � A ���dkrdnt�| �A �A S )Nr r
)�x��b�c�dr r* r r �<lambda>� � z<BooleanFunctionImproved.extended_translate.<locals>.<lambda>)r )r* r: r; r<