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::{AES_TO_POLYVAL_TRANSFORMATION, BINARY_TO_POLYVAL_TRANSFORMATION},
9	underlier::UnderlierType,
10	AESTowerField128b, AESTowerField16b, AESTowerField32b, AESTowerField64b, AESTowerField8b,
11	BinaryField128b, BinaryField128bPolyval, BinaryField16b, BinaryField1b, BinaryField32b,
12	BinaryField64b, BinaryField8b, ExtensionField, PackedExtension, PackedField, TowerField,
13};
14use trait_set::trait_set;
15
16/// A trait that groups a family of related [`TowerField`]s as associated types.
17pub trait TowerFamily: Sized {
18	type B1: TowerField + TryFrom<Self::B128>;
19	type B8: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1>;
20	type B16: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1> + ExtensionField<Self::B8>;
21	type B32: TowerField
22		+ TryFrom<Self::B128>
23		+ ExtensionField<Self::B1>
24		+ ExtensionField<Self::B8>
25		+ ExtensionField<Self::B16>;
26	type B64: TowerField
27		+ TryFrom<Self::B128>
28		+ ExtensionField<Self::B1>
29		+ ExtensionField<Self::B8>
30		+ ExtensionField<Self::B16>
31		+ ExtensionField<Self::B32>;
32	type B128: TowerField
33		+ ExtensionField<Self::B1>
34		+ ExtensionField<Self::B8>
35		+ ExtensionField<Self::B16>
36		+ ExtensionField<Self::B32>
37		+ ExtensionField<Self::B64>;
38}
39
40pub trait ProverTowerFamily: TowerFamily {
41	type FastB128: TowerField + From<Self::B128> + Into<Self::B128>;
42
43	fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
44	where
45		Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
46		FastTop: PackedField<Scalar = Self::FastB128>;
47}
48
49/// The canonical Fan-Paar tower family.
50#[derive(Debug)]
51pub struct CanonicalTowerFamily;
52
53impl TowerFamily for CanonicalTowerFamily {
54	type B1 = BinaryField1b;
55	type B8 = BinaryField8b;
56	type B16 = BinaryField16b;
57	type B32 = BinaryField32b;
58	type B64 = BinaryField64b;
59	type B128 = BinaryField128b;
60}
61
62impl ProverTowerFamily for CanonicalTowerFamily {
63	type FastB128 = BinaryField128bPolyval;
64
65	fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
66	where
67		Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
68		FastTop: PackedField<Scalar = Self::FastB128>,
69	{
70		Top::make_packed_transformation(BINARY_TO_POLYVAL_TRANSFORMATION)
71	}
72}
73
74/// The tower defined by Fan-Paar extensions built on top of the Rijndael field.
75#[derive(Debug)]
76pub struct AESTowerFamily;
77
78impl TowerFamily for AESTowerFamily {
79	type B1 = BinaryField1b;
80	type B8 = AESTowerField8b;
81	type B16 = AESTowerField16b;
82	type B32 = AESTowerField32b;
83	type B64 = AESTowerField64b;
84	type B128 = AESTowerField128b;
85}
86
87impl ProverTowerFamily for AESTowerFamily {
88	type FastB128 = BinaryField128bPolyval;
89
90	fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
91	where
92		Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
93		FastTop: PackedField<Scalar = Self::FastB128>,
94	{
95		Top::make_packed_transformation(AES_TO_POLYVAL_TRANSFORMATION)
96	}
97}
98
99trait_set! {
100	/// An underlier with associated packed types for fields in a tower.
101	pub trait TowerUnderlier<Tower: TowerFamily> =
102		UnderlierType
103		+ PackScalar<Tower::B1>
104		+ PackScalar<Tower::B8>
105		+ PackScalar<Tower::B16>
106		+ PackScalar<Tower::B32>
107		+ PackScalar<Tower::B64>
108		+ PackScalar<Tower::B128>;
109
110	pub trait ProverTowerUnderlier<Tower: ProverTowerFamily> =
111		TowerUnderlier<Tower> + PackScalar<Tower::FastB128>;
112
113	/// A packed field type that is the top packed field in a tower.
114	pub trait PackedTop<Tower: TowerFamily> =
115		PackedField<Scalar=Tower::B128>
116		+ PackedExtension<Tower::B1>
117		+ PackedExtension<Tower::B8>
118		+ PackedExtension<Tower::B16>
119		+ PackedExtension<Tower::B32>
120		+ PackedExtension<Tower::B64>
121		+ PackedExtension<Tower::B128>;
122}