1use super::MatPolynomialRingZq;
12use crate::{
13 integer::{MatPolyOverZ, PolyOverZ},
14 integer_mod_q::{ModulusPolynomialRingZq, PolynomialRingZq},
15 traits::{MatrixDimensions, MatrixGetEntry, MatrixGetSubmatrix},
16};
17use flint_sys::{fmpz_poly::fmpz_poly_struct, fmpz_poly_mat::fmpz_poly_mat_entry};
18
19impl MatPolynomialRingZq {
20 pub fn get_mod(&self) -> ModulusPolynomialRingZq {
35 self.modulus.clone()
36 }
37}
38
39impl MatPolynomialRingZq {
40 pub fn get_representative_least_nonnegative_residue(&self) -> MatPolyOverZ {
62 self.matrix.clone()
63 }
64}
65
66impl MatrixDimensions for MatPolynomialRingZq {
67 fn get_num_rows(&self) -> i64 {
83 self.matrix.get_num_rows()
84 }
85
86 fn get_num_columns(&self) -> i64 {
102 self.matrix.get_num_columns()
103 }
104}
105
106impl MatrixGetEntry<PolyOverZ> for MatPolynomialRingZq {
107 unsafe fn get_entry_unchecked(&self, row: i64, column: i64) -> PolyOverZ {
141 unsafe { self.matrix.get_entry_unchecked(row, column) }
142 }
143}
144
145impl MatrixGetEntry<PolynomialRingZq> for MatPolynomialRingZq {
146 unsafe fn get_entry_unchecked(&self, row: i64, column: i64) -> PolynomialRingZq {
180 PolynomialRingZq {
181 poly: unsafe { self.matrix.get_entry_unchecked(row, column) },
182 modulus: self.get_mod(),
183 }
184 }
185}
186
187impl MatrixGetSubmatrix for MatPolynomialRingZq {
188 unsafe fn get_submatrix_unchecked(
226 &self,
227 row_1: i64,
228 row_2: i64,
229 col_1: i64,
230 col_2: i64,
231 ) -> Self {
232 MatPolynomialRingZq {
233 matrix: unsafe {
234 self.matrix
235 .get_submatrix_unchecked(row_1, row_2, col_1, col_2)
236 },
237 modulus: self.get_mod(),
238 }
239 }
240}
241
242impl MatPolynomialRingZq {
243 #[allow(dead_code)]
262 pub(crate) fn collect_entries(&self) -> Vec<fmpz_poly_struct> {
263 let mut entries: Vec<fmpz_poly_struct> =
264 Vec::with_capacity((self.get_num_rows() * self.get_num_columns()) as usize);
265
266 for row in 0..self.get_num_rows() {
267 for col in 0..self.get_num_columns() {
268 let entry = unsafe { *fmpz_poly_mat_entry(&self.matrix.matrix, row, col) };
270 entries.push(entry);
271 }
272 }
273
274 entries
275 }
276}
277
278#[cfg(test)]
279mod test_get_entry {
280 use crate::integer::{MatPolyOverZ, PolyOverZ};
281 use crate::integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq, PolynomialRingZq};
282 use crate::traits::MatrixGetEntry;
283 use std::str::FromStr;
284
285 const LARGE_PRIME: u64 = u64::MAX - 58;
286
287 #[test]
289 fn get_edges() {
290 let modulus = ModulusPolynomialRingZq::from_str("2 42 17 mod 89").unwrap();
291 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
292
293 let entry_1: PolyOverZ = matrix.get_entry(0, 0).unwrap();
294 let entry_2: PolyOverZ = matrix.get_entry(4, 9).unwrap();
295
296 assert_eq!(PolyOverZ::default(), entry_1);
297 assert_eq!(PolyOverZ::default(), entry_2);
298 }
299
300 #[test]
302 fn large_positive() {
303 let modulus =
304 ModulusPolynomialRingZq::from_str(&format!("5 42 17 1 2 3 mod {LARGE_PRIME}"))
305 .unwrap();
306 let poly_mat =
307 MatPolyOverZ::from_str(&format!("[[4 1 0 {} 1, 1 42],[0, 2 1 2]]", i64::MAX))
308 .unwrap();
309 let matrix = MatPolynomialRingZq::from((&poly_mat, &modulus));
310
311 let entry: PolyOverZ = matrix.get_entry(0, 0).unwrap();
312
313 assert_eq!(
314 PolyOverZ::from_str(&format!("4 1 0 {} 1", i64::MAX)).unwrap(),
315 entry
316 );
317 }
318
319 #[test]
321 fn error_wrong_row() {
322 let modulus =
323 ModulusPolynomialRingZq::from_str(&format!("5 42 17 1 2 3 mod {LARGE_PRIME}"))
324 .unwrap();
325 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
326
327 assert!(MatrixGetEntry::<PolynomialRingZq>::get_entry(&matrix, 5, 1).is_err());
328 assert!(MatrixGetEntry::<PolynomialRingZq>::get_entry(&matrix, -6, 1).is_err());
329 assert!(MatrixGetEntry::<PolyOverZ>::get_entry(&matrix, 5, 1).is_err());
330 assert!(MatrixGetEntry::<PolyOverZ>::get_entry(&matrix, -6, 1).is_err());
331 }
332
333 #[test]
335 fn error_wrong_column() {
336 let modulus =
337 ModulusPolynomialRingZq::from_str(&format!("5 42 17 1 2 3 mod {LARGE_PRIME}"))
338 .unwrap();
339 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
340
341 assert!(MatrixGetEntry::<PolynomialRingZq>::get_entry(&matrix, 1, 10).is_err());
342 assert!(MatrixGetEntry::<PolynomialRingZq>::get_entry(&matrix, 1, -11).is_err());
343 assert!(MatrixGetEntry::<PolyOverZ>::get_entry(&matrix, 1, 10).is_err());
344 assert!(MatrixGetEntry::<PolyOverZ>::get_entry(&matrix, 1, -11).is_err());
345 }
346
347 #[test]
349 fn diff_types() {
350 let modulus =
351 ModulusPolynomialRingZq::from_str(&format!("5 42 17 1 2 3 mod {LARGE_PRIME}"))
352 .unwrap();
353 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
354
355 let _: PolyOverZ = matrix.get_entry(0, 0).unwrap();
356 let _: PolynomialRingZq = matrix.get_entry(0, 0).unwrap();
357 }
358}
359
360#[cfg(test)]
361mod test_get_num {
362 use crate::{
363 integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq},
364 traits::MatrixDimensions,
365 };
366 use std::str::FromStr;
367
368 #[test]
370 fn num_rows() {
371 let modulus = ModulusPolynomialRingZq::from_str("2 42 17 mod 89").unwrap();
372 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
373
374 assert_eq!(matrix.get_num_rows(), 5);
375 }
376
377 #[test]
379 fn num_columns() {
380 let modulus = ModulusPolynomialRingZq::from_str("2 42 17 mod 89").unwrap();
381 let matrix = MatPolynomialRingZq::new(5, 10, &modulus);
382
383 assert_eq!(matrix.get_num_columns(), 10);
384 }
385}
386
387#[cfg(test)]
388mod test_mod {
389 use crate::{
390 integer::MatPolyOverZ,
391 integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq},
392 };
393 use std::str::FromStr;
394
395 const LARGE_PRIME: u64 = u64::MAX - 58;
396
397 #[test]
399 fn get_mod() {
400 let modulus = ModulusPolynomialRingZq::from_str("2 42 17 mod 89").unwrap();
401 let poly_mat = MatPolyOverZ::from_str("[[4 -1 0 1 1, 1 42],[0, 2 1 2]]").unwrap();
402 let matrix = MatPolynomialRingZq::from((&poly_mat, &modulus));
403
404 assert_eq!(
405 matrix.get_mod(),
406 ModulusPolynomialRingZq::from_str("2 42 17 mod 89").unwrap()
407 );
408 }
409
410 #[test]
412 fn get_mod_large() {
413 let modulus =
414 ModulusPolynomialRingZq::from_str(&format!("2 42 17 mod {LARGE_PRIME}")).unwrap();
415 let poly_mat = MatPolyOverZ::from_str("[[4 -1 0 1 1, 1 42],[0, 2 1 2]]").unwrap();
416 let matrix = MatPolynomialRingZq::from((&poly_mat, &modulus));
417
418 assert_eq!(
419 matrix.get_mod(),
420 ModulusPolynomialRingZq::from_str(&format!("2 42 17 mod {LARGE_PRIME}")).unwrap()
421 );
422 }
423
424 #[test]
426 fn get_mod_memory() {
427 let modulus =
428 ModulusPolynomialRingZq::from_str(&format!("2 42 17 mod {LARGE_PRIME}")).unwrap();
429 let poly_mat = MatPolyOverZ::from_str("[[4 -1 0 1 1, 1 42],[0, 2 1 2]]").unwrap();
430 let matrix = MatPolynomialRingZq::from((&poly_mat, &modulus));
431 let _ = matrix.get_mod();
432 let _ = ModulusPolynomialRingZq::from_str(&format!("2 42 17 mod {LARGE_PRIME}")).unwrap();
433
434 let modulus = matrix.get_mod();
435
436 assert_eq!(
437 modulus,
438 ModulusPolynomialRingZq::from_str(&format!("2 42 17 mod {LARGE_PRIME}")).unwrap()
439 );
440 }
441}
442
443#[cfg(test)]
444mod test_get_representative_least_nonnegative_residue {
445 use crate::{
446 integer::MatPolyOverZ,
447 integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq},
448 };
449 use std::str::FromStr;
450
451 const LARGE_PRIME: u64 = u64::MAX - 58;
452
453 #[test]
455 fn get_representative_least_nonnegative_residue_large_entry_and_modulus() {
456 let modulus =
457 ModulusPolynomialRingZq::from_str(&format!("5 42 0 0 0 1 mod {LARGE_PRIME}")).unwrap();
458 let poly_mat = MatPolyOverZ::from_str("[[4 1 0 0 1, 1 42],[0, 1 -1]]").unwrap();
459 let matrix = MatPolynomialRingZq::from((&poly_mat, &modulus));
460
461 assert_eq!(
462 MatPolyOverZ::from_str(&format!(
463 "[[4 1 0 0 1, 1 42],[0, 1 {}]]",
464 LARGE_PRIME - 1
465 ))
466 .unwrap(),
467 matrix.get_representative_least_nonnegative_residue()
468 )
469 }
470}
471
472#[cfg(test)]
473mod test_get_vec {
474 use crate::{
475 integer::MatPolyOverZ,
476 integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq},
477 traits::MatrixGetSubmatrix,
478 };
479 use std::str::FromStr;
480
481 #[test]
483 fn get_row_works() {
484 let matrix = MatPolyOverZ::from_str(&format!(
485 "[[0, 0, 0],[1 42, 1 {}, 1 {}]]",
486 i64::MAX,
487 i64::MIN
488 ))
489 .unwrap();
490 let modulus =
491 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
492 let matrix = MatPolynomialRingZq::from((&matrix, &modulus));
493
494 let row_1 = matrix.get_row(0).unwrap();
495 let row_2 = matrix.get_row(1).unwrap();
496
497 let cmp_1 = MatPolyOverZ::from_str("[[0, 0, 0]]").unwrap();
498 let cmp_2 = MatPolyOverZ::from_str(&format!("[[1 42, 1 {}, 1 {}]]", i64::MAX, i64::MIN))
499 .unwrap();
500 let cmp_1 = MatPolynomialRingZq::from((&cmp_1, &modulus));
501 let cmp_2 = MatPolynomialRingZq::from((&cmp_2, &modulus));
502 assert_eq!(cmp_1, row_1);
503 assert_eq!(cmp_2, row_2);
504 }
505
506 #[test]
508 fn get_row_negative_indexing_works() {
509 let matrix = MatPolyOverZ::from_str(&format!(
510 "[[0, 0, 0],[1 42, 1 {}, 1 {}]]",
511 i64::MAX,
512 u64::MAX - 1
513 ))
514 .unwrap();
515 let modulus =
516 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
517 let matrix = MatPolynomialRingZq::from((&matrix, &modulus));
518 let row_1 = matrix.get_row(-2).unwrap();
519 let row_2 = matrix.get_row(-1).unwrap();
520
521 let cmp_1 = MatPolyOverZ::from_str("[[0, 0, 0]]").unwrap();
522 let cmp_2 =
523 MatPolyOverZ::from_str(&format!("[[1 42, 1 {}, 1 {}]]", i64::MAX, u64::MAX - 1))
524 .unwrap();
525
526 assert_eq!(cmp_1, row_1.matrix);
527 assert_eq!(cmp_2, row_2.matrix);
528 }
529
530 #[test]
532 fn get_column_works() {
533 let matrix = MatPolyOverZ::from_str(&format!(
534 "[[1 42, 0, 2 17 42],[1 {}, 0, 2 17 42],[1 {}, 0, 2 17 42]]",
535 i64::MAX,
536 i64::MIN
537 ))
538 .unwrap();
539 let modulus =
540 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
541 let matrix = MatPolynomialRingZq::from((&matrix, &modulus));
542
543 let column_1 = matrix.get_column(0).unwrap();
544 let column_2 = matrix.get_column(1).unwrap();
545 let column_3 = matrix.get_column(2).unwrap();
546
547 let cmp_1 =
548 MatPolyOverZ::from_str(&format!("[[1 42],[1 {}],[1 {}]]", i64::MAX, i64::MIN))
549 .unwrap();
550 let cmp_2 = MatPolyOverZ::from_str("[[0],[0],[0]]").unwrap();
551 let cmp_3 = MatPolyOverZ::from_str("[[2 17 42],[2 17 42],[2 17 42]]").unwrap();
552 let cmp_1 = MatPolynomialRingZq::from((&cmp_1, &modulus));
553 let cmp_2 = MatPolynomialRingZq::from((&cmp_2, &modulus));
554 let cmp_3 = MatPolynomialRingZq::from((&cmp_3, &modulus));
555 assert_eq!(cmp_1, column_1);
556 assert_eq!(cmp_2, column_2);
557 assert_eq!(cmp_3, column_3);
558 }
559
560 #[test]
562 fn get_column_negative_indexing_works() {
563 let matrix = MatPolyOverZ::from_str(&format!(
564 "[[1 42, 0, 2 17 42],[1 {}, 0, 2 17 42],[1 {}, 0, 2 17 42]]",
565 i64::MAX,
566 u64::MAX - 1
567 ))
568 .unwrap();
569 let modulus =
570 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
571 let matrix = MatPolynomialRingZq::from((&matrix, &modulus));
572 let column_1 = matrix.get_column(-3).unwrap();
573 let column_2 = matrix.get_column(-2).unwrap();
574 let column_3 = matrix.get_column(-1).unwrap();
575
576 let cmp_1 = MatPolyOverZ::from_str(&format!(
577 "[[1 42],[1 {}],[1 {}]]",
578 i64::MAX,
579 u64::MAX - 1
580 ))
581 .unwrap();
582 let cmp_2 = MatPolyOverZ::from_str("[[0],[0],[0]]").unwrap();
583 let cmp_3 = MatPolyOverZ::from_str("[[2 17 42],[2 17 42],[2 17 42]]").unwrap();
584
585 assert_eq!(cmp_1, column_1.matrix);
586 assert_eq!(cmp_2, column_2.matrix);
587 assert_eq!(cmp_3, column_3.matrix);
588 }
589
590 #[test]
592 fn wrong_dim_error() {
593 let modulus =
594 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
595 let matrix = MatPolyOverZ::from_str(&format!(
596 "[[1 17, 2 17 42, 3 1 1 1],[1 {}, 1 1, 2 2 3],[1 {}, 1 142, 1 1]]",
597 i64::MAX,
598 i64::MIN
599 ))
600 .unwrap();
601 let matrix = MatPolynomialRingZq::from((&matrix, &modulus));
602
603 let row_1 = matrix.get_row(-4);
604 let row_2 = matrix.get_row(4);
605 let column_1 = matrix.get_column(-4);
606 let column_2 = matrix.get_column(4);
607
608 assert!(row_1.is_err());
609 assert!(row_2.is_err());
610 assert!(column_1.is_err());
611 assert!(column_2.is_err());
612 }
613}
614
615#[cfg(test)]
616mod test_get_submatrix {
617 use crate::{
618 integer::{MatPolyOverZ, Z},
619 integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq},
620 traits::{MatrixDimensions, MatrixGetSubmatrix},
621 };
622 use std::str::FromStr;
623
624 #[test]
626 fn entire_matrix() {
627 let modulus =
628 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
629 let mat = MatPolyOverZ::identity(5, 5);
630 let mat = MatPolynomialRingZq::from((&mat, &modulus));
631
632 let sub_mat = mat.get_submatrix(0, 4, 0, 4).unwrap();
633
634 assert_eq!(mat, sub_mat);
635 }
636
637 #[test]
639 fn matrix_single_entry() {
640 let modulus =
641 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
642 let mat = MatPolyOverZ::identity(5, 5);
643 let mat = MatPolynomialRingZq::from((&mat, &modulus));
644
645 let sub_mat = mat.get_submatrix(0, 0, 0, 0).unwrap();
646
647 let cmp_mat = MatPolyOverZ::identity(1, 1);
648 let cmp_mat = MatPolynomialRingZq::from((&cmp_mat, &modulus));
649 assert_eq!(cmp_mat, sub_mat);
650 }
651
652 #[test]
654 fn correct_dimensions() {
655 let modulus =
656 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
657 let mat = MatPolyOverZ::identity(100, 100);
658 let mat = MatPolynomialRingZq::from((&mat, &modulus));
659
660 let sub_mat = mat.get_submatrix(1, 37, 0, 29).unwrap();
661
662 assert_eq!(37, sub_mat.get_num_rows());
663 assert_eq!(30, sub_mat.get_num_columns());
664 }
665
666 #[test]
669 fn large_entries() {
670 let modulus =
671 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
672 let mat = MatPolyOverZ::from_str(&format!(
673 "[[2 -1 {}, 1 2, 1 3],[1 1, 1 {}, 1 3]]",
674 i64::MAX,
675 i64::MIN
676 ))
677 .unwrap();
678 let mat = MatPolynomialRingZq::from((&mat, &modulus));
679
680 let sub_mat = mat.get_submatrix(0, 1, 0, 1).unwrap();
681
682 let cmp_mat = MatPolyOverZ::from_str(&format!(
683 "[[2 -1 {}, 1 2],[1 1, 1 {}]]",
684 i64::MAX,
685 i64::MIN
686 ))
687 .unwrap();
688 let cmp_mat = MatPolynomialRingZq::from((&cmp_mat, &modulus));
689 assert_eq!(cmp_mat, sub_mat);
690 }
691
692 #[test]
695 fn invalid_coordinates() {
696 let modulus =
697 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
698 let mat = MatPolyOverZ::identity(10, 10);
699 let mat = MatPolynomialRingZq::from((&mat, &modulus));
700
701 assert!(mat.get_submatrix(0, 0, 0, 10).is_err());
702 assert!(mat.get_submatrix(0, 10, 0, 0).is_err());
703 assert!(mat.get_submatrix(0, 0, -11, 0).is_err());
704 assert!(mat.get_submatrix(-11, 0, 0, 0).is_err());
705 }
706
707 #[test]
709 fn negative_indexing() {
710 let modulus =
711 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
712 let mat = MatPolyOverZ::identity(3, 3);
713 let matrix = MatPolynomialRingZq::from((&mat, &modulus));
714
715 assert_eq!(matrix, matrix.get_submatrix(0, -1, 0, -1).unwrap());
716 assert_eq!(matrix, matrix.get_submatrix(-3, -1, -3, -1).unwrap());
717 }
718
719 #[test]
721 #[should_panic]
722 fn no_columns() {
723 let modulus =
724 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
725 let mat = MatPolyOverZ::identity(10, 10);
726 let mat = MatPolynomialRingZq::from((&mat, &modulus));
727
728 let _ = mat.get_submatrix(0, 0, 6, 5);
729 }
730
731 #[test]
733 #[should_panic]
734 fn no_rows() {
735 let modulus =
736 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
737 let mat = MatPolyOverZ::identity(10, 10);
738 let mat = MatPolynomialRingZq::from((&mat, &modulus));
739
740 let _ = mat.get_submatrix(5, 4, 0, 0);
741 }
742
743 #[test]
745 fn availability() {
746 let modulus =
747 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {}", u64::MAX)).unwrap();
748 let mat = MatPolyOverZ::identity(10, 10);
749 let mat = MatPolynomialRingZq::from((&mat, &modulus));
750
751 let _ = mat.get_submatrix(0_i8, 0_i8, 0_i8, 0_i8);
752 let _ = mat.get_submatrix(0_i16, 0_i16, 0_i16, 0_i16);
753 let _ = mat.get_submatrix(0_i32, 0_i32, 0_i32, 0_i32);
754 let _ = mat.get_submatrix(0_i64, 0_i64, 0_i64, 0_i64);
755 let _ = mat.get_submatrix(0_u8, 0_u8, 0_u8, 0_u8);
756 let _ = mat.get_submatrix(0_u16, 0_i16, 0_u16, 0_u16);
757 let _ = mat.get_submatrix(0_u32, 0_i32, 0_u32, 0_u32);
758 let _ = mat.get_submatrix(0_u64, 0_i64, 0_u64, 0_u64);
759 let _ = mat.get_submatrix(&Z::ZERO, &Z::ZERO, &Z::ZERO, &Z::ZERO);
760 }
761}
762
763#[cfg(test)]
764mod test_collect_entries {
765 use crate::integer::{MatPolyOverZ, PolyOverZ};
766 use crate::integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq};
767 use flint_sys::fmpz_poly::fmpz_poly_set;
768 use std::str::FromStr;
769
770 const LARGE_PRIME: u64 = u64::MAX - 58;
771
772 #[test]
774 fn all_entries_collected() {
775 let modulus =
776 ModulusPolynomialRingZq::from_str(&format!("4 1 0 0 1 mod {LARGE_PRIME}")).unwrap();
777 let poly_mat_1 = MatPolyOverZ::from_str(&format!(
778 "[[4 -1 0 3 1, 1 {}],[2 1 2, 3 {} 1 1]]",
779 i64::MAX,
780 i64::MIN + 58,
781 ))
782 .unwrap();
783 let poly_ring_mat_1 = MatPolynomialRingZq::from((&poly_mat_1, &modulus));
784 let poly_mat_2 = MatPolyOverZ::from_str("[[1 42, 2 1 17]]").unwrap();
785 let poly_ring_mat_2 = MatPolynomialRingZq::from((&poly_mat_2, &modulus));
786
787 let entries_1 = poly_ring_mat_1.collect_entries();
788 let entries_2 = poly_ring_mat_2.collect_entries();
789
790 let mut entry_1 = PolyOverZ::default();
791 let mut entry_2 = entry_1.clone();
792 let mut entry_3 = entry_1.clone();
793
794 unsafe { fmpz_poly_set(&mut entry_1.poly, &entries_1[1]) }
795 unsafe { fmpz_poly_set(&mut entry_2.poly, &entries_1[3]) }
796 unsafe { fmpz_poly_set(&mut entry_3.poly, &entries_2[0]) }
797
798 assert_eq!(entries_1.len(), 4);
799 assert_eq!(
800 PolyOverZ::from_str(&format!("1 {}", i64::MAX)).unwrap(),
801 entry_1
802 );
803 assert_eq!(
804 PolyOverZ::from_str(&format!("3 {} 1 1", i64::MAX)).unwrap(),
805 entry_2
806 );
807
808 assert_eq!(entries_2.len(), 2);
809 assert_eq!(PolyOverZ::from(42), entry_3);
810 }
811
812 #[test]
814 fn doc_test() {
815 let modulus = ModulusPolynomialRingZq::from_str("4 1 0 0 1 mod 17").unwrap();
816 let poly_mat = MatPolyOverZ::from_str("[[4 -1 0 1 1, 1 42],[2 1 2, 3 1 1 1]]").unwrap();
817 let poly_ring_mat = MatPolynomialRingZq::from((&poly_mat, &modulus));
818
819 let _ = poly_ring_mat.collect_entries();
820 }
821}