use std::{fmt::Debug, hint::black_box, ops::Mul};
use typenum::{Logarithm2, PowerOfTwo};
use crate::{
algebra::{
field::FieldExtension,
multivariate_ring::{Evaluation, MultivariateRing},
},
types::{HeapArray, Positive},
};
pub const QASD_PUBLIC_ELEMENT_SEED: [u8; 32] = [
0x24, 0x3F, 0x6A, 0x88, 0x85, 0xA3, 0x08, 0xD3, 0x13, 0x19, 0x8A, 0x2E, 0x03, 0x70, 0x73, 0x44,
0xA4, 0x09, 0x38, 0x22, 0x29, 0x9F, 0x31, 0xD0, 0x08, 0x2E, 0xFA, 0x98, 0xEC, 0x4E, 0x6C, 0x89,
];
pub trait QasdParams: Send + Unpin + Debug + Clone {
type F: FieldExtension<Subfield = Self::F>;
type M: Positive + PowerOfTwo;
type BlockSize: Positive + PowerOfTwo + Logarithm2<Output = Self::N>;
type N: Positive;
type T: Positive
+ Mul<typenum::U9, Output: Positive>
+ Mul<typenum::U3, Output: Positive>
+ Mul<typenum::U4, Output: Positive>
+ Mul<Self::T, Output = Self::TSquared>;
type C: Positive + Mul<Self::C, Output = Self::CSquared>;
type TSquared: Positive + Mul<Self::CSquared, Output: Positive>;
type K: Positive;
type CSquared: Positive;
type TCSquared: Positive;
fn qasd_public_elements() -> HeapArray<MultivariateRing<Self::F, Self::M, Evaluation>, Self::C>;
fn warm_up() {
black_box(Self::qasd_public_elements());
}
}