1use std::marker::PhantomData;
2
3use crate::divisibility::PreparedDivisor;
4use crate::pid::EuclideanRing;
5use crate::pid::PrincipalIdealRing;
6use crate::ring::*;
7use crate::homomorphism::*;
8use crate::divisibility::DivisibilityRing;
9use crate::rings::extension::FreeAlgebra;
10use crate::rings::{zn::ZnRing, finite::FiniteRing};
11use crate::integer::{IntegerRingStore, IntegerRing};
12use crate::serialization::SerializableElementRing;
13use crate::specialization::*;
14
15pub trait DelegateRing: PartialEq {
252
253 type Base: ?Sized + RingBase;
254 type Element;
255
256 fn get_delegate(&self) -> &Self::Base;
257 fn delegate_ref<'a>(&self, el: &'a Self::Element) -> &'a <Self::Base as RingBase>::Element;
258 fn delegate_mut<'a>(&self, el: &'a mut Self::Element) -> &'a mut <Self::Base as RingBase>::Element;
259 fn delegate(&self, el: Self::Element) -> <Self::Base as RingBase>::Element;
260 fn rev_delegate(&self, el: <Self::Base as RingBase>::Element) -> Self::Element;
261
262 fn postprocess_delegate_mut(&self, el: &mut Self::Element) {
263 *el = self.rev_delegate(self.get_delegate().clone_el(self.delegate_ref(el)));
264 }
265
266 fn element_cast(&self, el: Self::Element) -> <Self as RingBase>::Element {
270 el
271 }
272
273 fn rev_element_cast(&self, el: <Self as RingBase>::Element) -> Self::Element {
277 el
278 }
279
280 fn rev_element_cast_ref<'a>(&self, el: &'a <Self as RingBase>::Element) -> &'a Self::Element {
284 el
285 }
286}
287
288impl<R: DelegateRing + PartialEq + ?Sized> RingBase for R {
289
290 type Element = <Self as DelegateRing>::Element;
291
292 default fn clone_el(&self, val: &Self::Element) -> Self::Element {
293 self.rev_delegate(self.get_delegate().clone_el(self.delegate_ref(val)))
294 }
295
296 default fn add_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element) {
297 self.get_delegate().add_assign_ref(self.delegate_mut(lhs), self.delegate_ref(rhs));
298 self.postprocess_delegate_mut(lhs);
299 }
300
301 default fn add_assign(&self, lhs: &mut Self::Element, rhs: Self::Element) {
302 self.get_delegate().add_assign(self.delegate_mut(lhs), self.delegate(rhs));
303 self.postprocess_delegate_mut(lhs);
304 }
305
306 default fn sub_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element) {
307 self.get_delegate().sub_assign_ref(self.delegate_mut(lhs), self.delegate_ref(rhs));
308 self.postprocess_delegate_mut(lhs);
309 }
310
311 default fn sub_self_assign(&self, lhs: &mut Self::Element, rhs: Self::Element) {
312 self.get_delegate().sub_self_assign(self.delegate_mut(lhs), self.delegate(rhs));
313 self.postprocess_delegate_mut(lhs);
314 }
315
316 default fn sub_self_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element) {
317 self.get_delegate().sub_self_assign_ref(self.delegate_mut(lhs), self.delegate_ref(rhs));
318 self.postprocess_delegate_mut(lhs);
319 }
320
321 default fn negate_inplace(&self, lhs: &mut Self::Element) {
322 self.get_delegate().negate_inplace(self.delegate_mut(lhs));
323 self.postprocess_delegate_mut(lhs);
324 }
325
326 default fn mul_assign(&self, lhs: &mut Self::Element, rhs: Self::Element) {
327 self.get_delegate().mul_assign(self.delegate_mut(lhs), self.delegate(rhs));
328 self.postprocess_delegate_mut(lhs);
329 }
330
331 default fn mul_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element) {
332 self.get_delegate().mul_assign_ref(self.delegate_mut(lhs), self.delegate_ref(rhs));
333 self.postprocess_delegate_mut(lhs);
334 }
335
336 default fn square(&self, value: &mut Self::Element) {
337 self.get_delegate().square(self.delegate_mut(value));
338 self.postprocess_delegate_mut(value);
339 }
340
341 default fn zero(&self) -> Self::Element {
342 self.rev_delegate(self.get_delegate().zero())
343 }
344
345 default fn one(&self) -> Self::Element {
346 self.rev_delegate(self.get_delegate().one())
347 }
348
349 default fn neg_one(&self) -> Self::Element {
350 self.rev_delegate(self.get_delegate().neg_one())
351 }
352
353 default fn from_int(&self, value: i32) -> Self::Element {
354 self.rev_delegate(self.get_delegate().from_int(value))
355 }
356
357 default fn eq_el(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool {
358 self.get_delegate().eq_el(self.delegate_ref(lhs), self.delegate_ref(rhs))
359 }
360
361 default fn is_zero(&self, value: &Self::Element) -> bool {
362 self.get_delegate().is_zero(self.delegate_ref(value))
363 }
364
365 default fn is_one(&self, value: &Self::Element) -> bool {
366 self.get_delegate().is_one(self.delegate_ref(value))
367 }
368
369 default fn is_neg_one(&self, value: &Self::Element) -> bool {
370 self.get_delegate().is_neg_one(self.delegate_ref(value))
371 }
372
373 default fn is_commutative(&self) -> bool {
374 self.get_delegate().is_commutative()
375 }
376
377 default fn is_noetherian(&self) -> bool {
378 self.get_delegate().is_noetherian()
379 }
380
381 default fn dbg<'a>(&self, value: &Self::Element, out: &mut std::fmt::Formatter<'a>) -> std::fmt::Result {
382 self.get_delegate().dbg(self.delegate_ref(value), out)
383 }
384
385 default fn dbg_within<'a>(&self, value: &Self::Element, out: &mut std::fmt::Formatter<'a>, env: EnvBindingStrength) -> std::fmt::Result {
386 self.get_delegate().dbg_within(self.delegate_ref(value), out, env)
387 }
388
389 default fn negate(&self, value: Self::Element) -> Self::Element {
390 self.rev_delegate(self.get_delegate().negate(self.delegate(value)))
391 }
392
393 default fn sub_assign(&self, lhs: &mut Self::Element, rhs: Self::Element) {
394 self.get_delegate().sub_assign(self.delegate_mut(lhs), self.delegate(rhs));
395 self.postprocess_delegate_mut(lhs);
396 }
397
398 default fn add_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element {
399 self.rev_delegate(self.get_delegate().add_ref(self.delegate_ref(lhs), self.delegate_ref(rhs)))
400 }
401
402 default fn add_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element {
403 self.rev_delegate(self.get_delegate().add_ref_fst(self.delegate_ref(lhs), self.delegate(rhs)))
404 }
405
406 default fn add_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element {
407 self.rev_delegate(self.get_delegate().add_ref_snd(self.delegate(lhs), self.delegate_ref(rhs)))
408 }
409
410 default fn add(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element {
411 self.rev_delegate(self.get_delegate().add(self.delegate(lhs), self.delegate(rhs)))
412 }
413
414 default fn sub_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element {
415 self.rev_delegate(self.get_delegate().sub_ref(self.delegate_ref(lhs), self.delegate_ref(rhs)))
416 }
417
418 default fn sub_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element {
419 self.rev_delegate(self.get_delegate().sub_ref_fst(self.delegate_ref(lhs), self.delegate(rhs)))
420 }
421
422 default fn sub_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element {
423 self.rev_delegate(self.get_delegate().sub_ref_snd(self.delegate(lhs), self.delegate_ref(rhs)))
424 }
425
426 default fn sub(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element {
427 self.rev_delegate(self.get_delegate().sub(self.delegate(lhs), self.delegate(rhs)))
428 }
429
430 default fn mul_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element {
431 self.rev_delegate(self.get_delegate().mul_ref(self.delegate_ref(lhs), self.delegate_ref(rhs)))
432 }
433
434 default fn mul_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element {
435 self.rev_delegate(self.get_delegate().mul_ref_fst(self.delegate_ref(lhs), self.delegate(rhs)))
436 }
437
438 default fn mul_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element {
439 self.rev_delegate(self.get_delegate().mul_ref_snd(self.delegate(lhs), self.delegate_ref(rhs)))
440 }
441
442 default fn mul(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element {
443 self.rev_delegate(self.get_delegate().mul(self.delegate(lhs), self.delegate(rhs)))
444 }
445
446 default fn is_approximate(&self) -> bool { self.get_delegate().is_approximate() }
447
448 default fn mul_assign_int(&self, lhs: &mut Self::Element, rhs: i32) {
449 self.get_delegate().mul_assign_int(self.delegate_mut(lhs), rhs);
450 self.postprocess_delegate_mut(lhs);
451 }
452
453 default fn mul_int(&self, lhs: Self::Element, rhs: i32) -> Self::Element {
454 self.rev_delegate(self.get_delegate().mul_int(self.delegate(lhs), rhs))
455 }
456
457 default fn mul_int_ref(&self, lhs: &Self::Element, rhs: i32) -> Self::Element {
458 self.rev_delegate(self.get_delegate().mul_int_ref(self.delegate_ref(lhs), rhs))
459 }
460
461 default fn pow_gen<S: IntegerRingStore>(&self, x: Self::Element, power: &El<S>, integers: S) -> Self::Element
462 where S::Type: IntegerRing
463 {
464 self.rev_delegate(self.get_delegate().pow_gen(self.delegate(x), power, integers))
465 }
466
467 default fn characteristic<I: IntegerRingStore + Copy>(&self, ZZ: I) -> Option<El<I>>
468 where I::Type: IntegerRing
469 {
470 self.get_delegate().characteristic(ZZ)
471 }
472}
473
474impl<R: DelegateRing + ?Sized> DivisibilityRing for R
475 where R::Base: DivisibilityRing
476{
477 type PreparedDivisorData = PreparedDivisor<R::Base>;
478
479 default fn checked_left_div(&self, lhs: &Self::Element, rhs: &Self::Element) -> Option<Self::Element> {
480 self.get_delegate().checked_left_div(self.delegate_ref(lhs), self.delegate_ref(rhs))
481 .map(|x| self.rev_delegate(x))
482 }
483
484 default fn balance_factor<'a, I>(&self, elements: I) -> Option<Self::Element>
485 where I: Iterator<Item = &'a Self::Element>,
486 Self: 'a
487 {
488 self.get_delegate().balance_factor(elements.map(|x| self.delegate_ref(x))).map(|c| self.rev_delegate(c))
489 }
490
491 fn prepare_divisor(&self, x: Self::Element) -> PreparedDivisor<Self> {
492 let prepared = self.get_delegate().prepare_divisor(self.delegate(x));
493 PreparedDivisor {
494 element: self.rev_delegate(self.get_delegate().clone_el(&prepared.element)),
495 data: prepared
496 }
497 }
498
499 default fn checked_left_div_prepared(&self, lhs: &Self::Element, rhs: &PreparedDivisor<Self>) -> Option<Self::Element> {
500 self.get_delegate().checked_left_div_prepared(self.delegate_ref(lhs), &rhs.data)
501 .map(|res| self.rev_delegate(res))
502 }
503
504 default fn divides_left_prepared(&self, lhs: &Self::Element, rhs: &PreparedDivisor<Self>) -> bool {
505 self.checked_left_div_prepared(lhs, rhs).is_some()
506 }
507}
508
509impl<R: DelegateRing + ?Sized> SerializableElementRing for R
510 where R::Base: DivisibilityRing + SerializableElementRing
511{
512 default fn serialize<S>(&self, el: &Self::Element, serializer: S) -> Result<S::Ok, S::Error>
513 where S: serde::Serializer
514 {
515 self.get_delegate().serialize(self.delegate_ref(el), serializer)
516 }
517
518 default fn deserialize<'de, D>(&self, deserializer: D) -> Result<Self::Element, D::Error>
519 where D: serde::Deserializer<'de>
520 {
521 self.get_delegate().deserialize(deserializer).map(|x| self.rev_delegate(x))
522 }
523}
524
525pub struct DelegateFiniteRingElementsIter<'a, R: ?Sized>
526 where R: DelegateRing, R::Base: FiniteRing
527{
528 ring: &'a R,
529 base: <R::Base as FiniteRing>::ElementsIter<'a>
530}
531
532impl<'a, R: ?Sized> Clone for DelegateFiniteRingElementsIter<'a, R>
533 where R: DelegateRing, R::Base: FiniteRing
534{
535 fn clone(&self) -> Self {
536 Self { ring: self.ring, base: self.base.clone() }
537 }
538}
539
540impl<'a, R: ?Sized> Iterator for DelegateFiniteRingElementsIter<'a, R>
541 where R: DelegateRing, R::Base: FiniteRing
542{
543 type Item = <R as RingBase>::Element;
544
545 fn next(&mut self) -> Option<Self::Item> {
546 self.base.next().map(|x| self.ring.rev_delegate(x))
547 }
548}
549
550pub trait DelegateRingImplFiniteRing: DelegateRing {}
558
559impl<R: DelegateRingImplFiniteRing + ?Sized> FiniteRing for R
560 where R::Base: FiniteRing
561{
562 type ElementsIter<'a> = DelegateFiniteRingElementsIter<'a, R>
563 where R: 'a;
564
565 fn elements<'a>(&'a self) -> Self::ElementsIter<'a> {
566 DelegateFiniteRingElementsIter {
567 ring: self,
568 base: self.get_delegate().elements()
569 }
570 }
571
572 default fn random_element<G: FnMut() -> u64>(&self, rng: G) -> <R as RingBase>::Element {
573 self.element_cast(self.rev_delegate(self.get_delegate().random_element(rng)))
574 }
575
576 default fn size<I: IntegerRingStore + Copy>(&self, ZZ: I) -> Option<El<I>>
577 where I::Type: IntegerRing
578 {
579 self.get_delegate().size(ZZ)
580 }
581}
582
583impl<R: DelegateRing + ?Sized> HashableElRing for R
584 where R::Base: HashableElRing
585{
586 default fn hash<H: std::hash::Hasher>(&self, el: &Self::Element, h: &mut H) {
587 self.get_delegate().hash(self.delegate_ref(el), h)
588 }
589}
590
591pub trait DelegateRingImplEuclideanRing: DelegateRing {}
600
601impl<R: DelegateRingImplEuclideanRing + ?Sized> PrincipalIdealRing for R
602 where R::Base: PrincipalIdealRing
603{
604 default fn checked_div_min(&self, lhs: &Self::Element, rhs: &Self::Element) -> Option<Self::Element> {
605 self.get_delegate().checked_div_min(self.delegate_ref(lhs), self.delegate_ref(rhs)).map(|res| self.rev_delegate(res))
606 }
607
608 default fn extended_ideal_gen(&self, lhs: &Self::Element, rhs: &Self::Element) -> (Self::Element, Self::Element, Self::Element) {
609 let (s, t, d) = self.get_delegate().extended_ideal_gen(self.delegate_ref(self.rev_element_cast_ref(lhs)), self.delegate_ref(self.rev_element_cast_ref(rhs)));
610 return (self.element_cast(self.rev_delegate(s)), self.element_cast(self.rev_delegate(t)), self.element_cast(self.rev_delegate(d)));
611 }
612
613 default fn ideal_gen(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element {
614 self.element_cast(self.rev_delegate(self.get_delegate().ideal_gen(self.delegate_ref(self.rev_element_cast_ref(lhs)), self.delegate_ref(self.rev_element_cast_ref(rhs)))))
615 }
616}
617
618impl<R: DelegateRingImplEuclideanRing + ?Sized> EuclideanRing for R
619 where R::Base: EuclideanRing
620{
621 default fn euclidean_div_rem(&self, lhs: Self::Element, rhs: &Self::Element) -> (Self::Element, Self::Element) {
622 let (q, r) = self.get_delegate().euclidean_div_rem(self.delegate(lhs), self.delegate_ref(rhs));
623 return (self.rev_delegate(q), self.rev_delegate(r));
624 }
625
626 fn euclidean_deg(&self, val: &Self::Element) -> Option<usize> {
627 self.get_delegate().euclidean_deg(self.delegate_ref(val))
628 }
629
630 fn euclidean_div(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element {
631 self.rev_delegate(self.get_delegate().euclidean_div(self.delegate(lhs), self.delegate_ref(rhs)))
632 }
633
634 fn euclidean_rem(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element {
635 self.rev_delegate(self.get_delegate().euclidean_rem(self.delegate(lhs), self.delegate_ref(rhs)))
636 }
637}
638
639impl<R> FiniteRingSpecializable for R
640 where R: DelegateRingImplFiniteRing + ?Sized,
641 R::Base: FiniteRingSpecializable
642{
643 fn specialize<O: FiniteRingOperation<Self>>(op: O) -> Result<O::Output, ()> {
644 struct OpWrapper<R, O>
645 where R: DelegateRingImplFiniteRing + ?Sized,
646 R::Base: FiniteRingSpecializable,
647 O: FiniteRingOperation<R>
648 {
649 operation: O,
650 ring: PhantomData<Box<R>>
651 }
652
653 impl<R, O> FiniteRingOperation<R::Base> for OpWrapper<R, O>
654 where R: DelegateRingImplFiniteRing + ?Sized,
655 R::Base: FiniteRingSpecializable,
656 O: FiniteRingOperation<R>
657 {
658 type Output = O::Output;
659 fn execute(self) -> Self::Output where R::Base: FiniteRing {
660 self.operation.execute()
661 }
662 }
663
664 <R::Base as FiniteRingSpecializable>::specialize(OpWrapper { operation: op, ring: PhantomData })
665 }
666}
667
668impl<R: DelegateRingImplFiniteRing + ?Sized> ZnRing for R
669 where R::Base: ZnRing,
670 Self: PrincipalIdealRing,
671 R: CanHomFrom<<R::Base as ZnRing>::IntegerRingBase>
672{
673 type IntegerRingBase = <R::Base as ZnRing>::IntegerRingBase;
674 type IntegerRing = <R::Base as ZnRing>::IntegerRing;
675
676 default fn integer_ring(&self) -> &Self::IntegerRing {
677 self.get_delegate().integer_ring()
678 }
679
680 default fn modulus(&self) -> &El<Self::IntegerRing> {
681 self.get_delegate().modulus()
682 }
683
684 default fn smallest_positive_lift(&self, el: Self::Element) -> El<Self::IntegerRing> {
685 self.get_delegate().smallest_positive_lift(self.delegate(self.rev_element_cast(el)))
686 }
687
688 default fn smallest_lift(&self, el: Self::Element) -> El<Self::IntegerRing> {
689 self.get_delegate().smallest_lift(self.delegate(self.rev_element_cast(el)))
690 }
691
692 default fn from_int_promise_reduced(&self, x: El<Self::IntegerRing>) -> Self::Element {
693 self.element_cast(self.rev_delegate(self.get_delegate().from_int_promise_reduced(x)))
694 }
695}
696
697impl<R> RingExtension for R
698 where R: DelegateRing,
699 R::Base: RingExtension
700{
701 type BaseRing = <R::Base as RingExtension>::BaseRing;
702
703 fn base_ring<'a>(&'a self) -> &'a Self::BaseRing {
704 self.get_delegate().base_ring()
705 }
706
707 fn from(&self, x: El<Self::BaseRing>) -> Self::Element {
708 self.rev_delegate(self.get_delegate().from(x))
709 }
710}
711
712impl<R> FreeAlgebra for R
713 where R: DelegateRing,
714 <R as DelegateRing>::Base: FreeAlgebra
715{
716 type VectorRepresentation<'a> = <<R as DelegateRing>::Base as FreeAlgebra>::VectorRepresentation<'a>
717 where Self: 'a;
718
719 default fn canonical_gen(&self) -> Self::Element {
720 self.rev_delegate(self.get_delegate().canonical_gen())
721 }
722
723 default fn from_canonical_basis<V>(&self, vec: V) -> Self::Element
724 where V: IntoIterator<Item = El<Self::BaseRing>>,
725 V::IntoIter: DoubleEndedIterator
726 {
727 self.rev_delegate(self.get_delegate().from_canonical_basis(vec.into_iter().map(|x| x)))
728 }
729
730 default fn rank(&self) -> usize {
731 self.get_delegate().rank()
732 }
733
734 default fn wrt_canonical_basis<'a>(&'a self, el: &'a Self::Element) -> Self::VectorRepresentation<'a> {
735 self.get_delegate().wrt_canonical_basis(self.delegate_ref(el))
736 }
737}
738
739#[stability::unstable(feature = "enable")]
740pub struct WrapHom<'a, R>
741 where R: DelegateRing
742{
743 to: RingRef<'a, R>,
744 from: RingRef<'a, R::Base>
745}
746
747impl<'a, R> WrapHom<'a, R>
748 where R: DelegateRing
749{
750 #[stability::unstable(feature = "enable")]
751 pub fn new(ring: &'a R) -> Self {
752 Self {
753 to: RingRef::new(ring),
754 from: RingRef::new(ring.get_delegate())
755 }
756 }
757}
758
759impl<'a, R> Homomorphism<<R as DelegateRing>::Base, R> for WrapHom<'a, R>
760 where R: DelegateRing
761{
762 type DomainStore = RingRef<'a, <R as DelegateRing>::Base>;
763 type CodomainStore = RingRef<'a, R>;
764
765 fn domain<'b>(&'b self) -> &'b Self::DomainStore {
766 &self.from
767 }
768
769 fn codomain<'b>(&'b self) -> &'b Self::CodomainStore {
770 &self.to
771 }
772
773 fn map(&self, x: <<R as DelegateRing>::Base as RingBase>::Element) -> <R as RingBase>::Element {
774 self.to.get_ring().element_cast(self.to.get_ring().rev_delegate(x))
775 }
776}
777
778#[stability::unstable(feature = "enable")]
779pub struct UnwrapHom<'a, R>
780 where R: DelegateRing
781{
782 from: RingRef<'a, R>,
783 to: RingRef<'a, R::Base>
784}
785
786impl<'a, R> UnwrapHom<'a, R>
787 where R: DelegateRing
788{
789 #[stability::unstable(feature = "enable")]
790 pub fn new(ring: &'a R) -> Self {
791 Self {
792 from: RingRef::new(ring),
793 to: RingRef::new(ring.get_delegate())
794 }
795 }
796}
797
798impl<'a, R> Homomorphism<R, <R as DelegateRing>::Base> for UnwrapHom<'a, R>
799 where R: DelegateRing
800{
801 type DomainStore = RingRef<'a, R>;
802 type CodomainStore = RingRef<'a, <R as DelegateRing>::Base>;
803
804 fn domain<'b>(&'b self) -> &'b Self::DomainStore {
805 &self.from
806 }
807
808 fn codomain<'b>(&'b self) -> &'b Self::CodomainStore {
809 &self.to
810 }
811
812 fn map(&self, x: <R as RingBase>::Element) -> <<R as DelegateRing>::Base as RingBase>::Element {
813 self.from.get_ring().delegate(self.from.get_ring().rev_element_cast(x))
814 }
815}