binius_core/
tower.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3//! Traits for working with field towers.
4
5use 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
19/// A trait that groups a family of related [`TowerField`]s as associated types.
20pub 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/// The canonical Fan-Paar tower family.
58#[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/// The tower defined by Fan-Paar extensions built on top of the Rijndael field.
91#[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	/// An underlier with associated packed types for fields in a tower.
125	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	/// A packed field type that is the top packed field in a tower.
138	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}