qfall_math/integer_mod_q/mat_polynomial_ring_zq.rs
1// Copyright 2023 Marcel Luca Schmidt
2//
3// This file is part of qFALL-math.
4//
5// qFALL-math is free software: you can redistribute it and/or modify it under
6// the terms of the Mozilla Public License Version 2.0 as published by the
7// Mozilla Foundation. See <https://mozilla.org/en-US/MPL/2.0/>.
8
9//! [`MatPolynomialRingZq`] is a type of matrix with entries of [`PolynomialRingZq`](crate::integer_mod_q::PolynomialRingZq).
10//! This implementation uses the [FLINT](https://flintlib.org/) library.
11
12use super::ModulusPolynomialRingZq;
13use crate::integer::MatPolyOverZ;
14use derive_more::Display;
15use serde::{Deserialize, Serialize};
16
17mod arithmetic;
18mod cmp;
19mod coefficient_embedding;
20mod concat;
21mod default;
22mod from;
23mod get;
24mod norm;
25mod properties;
26mod reduce;
27mod sample;
28mod set;
29mod sort;
30mod tensor;
31mod to_string;
32mod transpose;
33mod unsafe_functions;
34mod vector;
35
36/// [`MatPolynomialRingZq`] is a matrix with entries of type [`PolynomialRingZq`](crate::integer_mod_q::PolynomialRingZq).
37///
38/// Attributes:
39/// - `matrix`: holds the [`MatPolyOverZ`] matrix
40/// - `modulus`: holds the [`ModulusPolynomialRingZq`] modulus of the matrix
41///
42/// # Examples
43/// ## Matrix usage
44/// ```
45/// use qfall_math::{
46/// integer::{PolyOverZ, MatPolyOverZ},
47/// integer_mod_q::{MatPolynomialRingZq, PolyOverZq},
48/// traits::{MatrixGetEntry, MatrixSetEntry},
49/// };
50/// use std::str::FromStr;
51///
52/// // instantiate new matrix
53/// let id_mat = MatPolyOverZ::identity(2, 2);
54/// // instantiate modulus_object
55/// let modulus = PolyOverZq::from_str("5 1 0 0 0 1 mod 17").unwrap();
56///
57/// let poly_mat = MatPolynomialRingZq::from((id_mat, modulus));
58///
59/// // clone object, set and get entry
60/// let mut clone = poly_mat.clone();
61/// clone.set_entry(0, 0, PolyOverZ::from(-16));
62///
63/// let entry: PolyOverZ = clone.get_entry(0,0).unwrap();
64/// assert_eq!(
65/// entry,
66/// PolyOverZ::from(1),
67/// );
68///
69/// // to_string
70/// assert_eq!("[[1 1, 0],[0, 1 1]] / 5 1 0 0 0 1 mod 17", &poly_mat.to_string());
71/// ```
72///
73/// ## Vector usage
74/// ```
75/// use qfall_math::{
76/// integer::{PolyOverZ, MatPolyOverZ},
77/// integer_mod_q::{MatPolynomialRingZq, PolyOverZq},
78/// };
79/// use std::str::FromStr;
80///
81/// let row_vec = MatPolyOverZ::from_str("[[1 1, 0, 1 1]]").unwrap();
82/// let col_vec = MatPolyOverZ::from_str("[[1 -5],[1 -1],[0]]").unwrap();
83///
84/// let modulus = PolyOverZq::from_str("5 1 0 0 0 1 mod 17").unwrap();
85///
86/// let row_vec = MatPolynomialRingZq::from((row_vec, modulus));
87/// let col_vec = MatPolynomialRingZq::from((col_vec, row_vec.get_mod()));
88///
89/// // check if matrix instance is vector
90/// assert!(row_vec.is_row_vector());
91/// assert!(col_vec.is_column_vector());
92/// ```
93#[derive(PartialEq, Eq, Serialize, Deserialize, Display, Clone, Debug)]
94#[display("{matrix} / {modulus}")]
95pub struct MatPolynomialRingZq {
96 pub(crate) matrix: MatPolyOverZ,
97 pub(crate) modulus: ModulusPolynomialRingZq,
98}