binius_core/
tower.rs
1use binius_field::{
6 as_packed_field::PackScalar,
7 linear_transformation::{PackedTransformationFactory, Transformation},
8 polyval::{
9 AES_TO_POLYVAL_TRANSFORMATION, BINARY_TO_POLYVAL_TRANSFORMATION,
10 POLYVAL_TO_AES_TRANSFORMARION, POLYVAL_TO_BINARY_TRANSFORMATION,
11 },
12 underlier::UnderlierType,
13 AESTowerField128b, AESTowerField16b, AESTowerField32b, AESTowerField64b, AESTowerField8b,
14 BinaryField128b, BinaryField128bPolyval, BinaryField16b, BinaryField1b, BinaryField32b,
15 BinaryField64b, BinaryField8b, ExtensionField, PackedExtension, PackedField, TowerField,
16};
17use trait_set::trait_set;
18
19pub trait TowerFamily: Sized {
21 type B1: TowerField + TryFrom<Self::B128>;
22 type B8: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1>;
23 type B16: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1> + ExtensionField<Self::B8>;
24 type B32: TowerField
25 + TryFrom<Self::B128>
26 + ExtensionField<Self::B1>
27 + ExtensionField<Self::B8>
28 + ExtensionField<Self::B16>;
29 type B64: TowerField
30 + TryFrom<Self::B128>
31 + ExtensionField<Self::B1>
32 + ExtensionField<Self::B8>
33 + ExtensionField<Self::B16>
34 + ExtensionField<Self::B32>;
35 type B128: TowerField
36 + ExtensionField<Self::B1>
37 + ExtensionField<Self::B8>
38 + ExtensionField<Self::B16>
39 + ExtensionField<Self::B32>
40 + ExtensionField<Self::B64>;
41}
42
43pub trait ProverTowerFamily: TowerFamily {
44 type FastB128: TowerField + From<Self::B128> + Into<Self::B128> + ExtensionField<Self::B1>;
45
46 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
47 where
48 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
49 FastTop: PackedField<Scalar = Self::FastB128>;
50
51 fn packed_transformation_from_fast<FastTop, Top>() -> impl Transformation<FastTop, Top>
52 where
53 FastTop: PackedTransformationFactory<Top>,
54 Top: PackedField<Scalar = Self::B128>;
55}
56
57#[derive(Debug)]
59pub struct CanonicalTowerFamily;
60
61impl TowerFamily for CanonicalTowerFamily {
62 type B1 = BinaryField1b;
63 type B8 = BinaryField8b;
64 type B16 = BinaryField16b;
65 type B32 = BinaryField32b;
66 type B64 = BinaryField64b;
67 type B128 = BinaryField128b;
68}
69
70impl ProverTowerFamily for CanonicalTowerFamily {
71 type FastB128 = BinaryField128bPolyval;
72
73 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
74 where
75 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
76 FastTop: PackedField<Scalar = Self::FastB128>,
77 {
78 Top::make_packed_transformation(BINARY_TO_POLYVAL_TRANSFORMATION)
79 }
80
81 fn packed_transformation_from_fast<FastTop, Top>() -> impl Transformation<FastTop, Top>
82 where
83 FastTop: PackedTransformationFactory<Top>,
84 Top: PackedField<Scalar = Self::B128>,
85 {
86 FastTop::make_packed_transformation(POLYVAL_TO_BINARY_TRANSFORMATION)
87 }
88}
89
90#[derive(Debug)]
92pub struct AESTowerFamily;
93
94impl TowerFamily for AESTowerFamily {
95 type B1 = BinaryField1b;
96 type B8 = AESTowerField8b;
97 type B16 = AESTowerField16b;
98 type B32 = AESTowerField32b;
99 type B64 = AESTowerField64b;
100 type B128 = AESTowerField128b;
101}
102
103impl ProverTowerFamily for AESTowerFamily {
104 type FastB128 = BinaryField128bPolyval;
105
106 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
107 where
108 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
109 FastTop: PackedField<Scalar = Self::FastB128>,
110 {
111 Top::make_packed_transformation(AES_TO_POLYVAL_TRANSFORMATION)
112 }
113
114 fn packed_transformation_from_fast<FastTop, Top>() -> impl Transformation<FastTop, Top>
115 where
116 FastTop: PackedTransformationFactory<Top>,
117 Top: PackedField<Scalar = Self::B128>,
118 {
119 FastTop::make_packed_transformation(POLYVAL_TO_AES_TRANSFORMARION)
120 }
121}
122
123trait_set! {
124 pub trait TowerUnderlier<Tower: TowerFamily> =
126 UnderlierType
127 + PackScalar<Tower::B1>
128 + PackScalar<Tower::B8>
129 + PackScalar<Tower::B16>
130 + PackScalar<Tower::B32>
131 + PackScalar<Tower::B64>
132 + PackScalar<Tower::B128>;
133
134 pub trait ProverTowerUnderlier<Tower: ProverTowerFamily> =
135 TowerUnderlier<Tower> + PackScalar<Tower::FastB128>;
136
137 pub trait PackedTop<Tower: TowerFamily> =
139 PackedField<Scalar=Tower::B128>
140 + PackedExtension<Tower::B1>
141 + PackedExtension<Tower::B8>
142 + PackedExtension<Tower::B16>
143 + PackedExtension<Tower::B32>
144 + PackedExtension<Tower::B64>
145 + PackedExtension<Tower::B128>;
146}