pub fn prove<FGenerator, F, PBits, PChallenge, PGenerator, FDomain, Transcript, Backend, const EXPONENT_BIT_WIDTH: usize>(
    witness: &GeneratorExponentWitness<'_, PBits, PGenerator, PChallenge, EXPONENT_BIT_WIDTH>,
    claim: &LayerClaim<F>,
    evaluation_domain_factory: impl EvaluationDomainFactory<FDomain>,
    transcript: Transcript,
    backend: &Backend,
) -> Result<GeneratorExponentReductionOutput<F, EXPONENT_BIT_WIDTH>, Error>
where FDomain: Field, PBits: PackedField, PGenerator: PackedExtension<PBits::Scalar, PackedSubfield = PBits> + PackedFieldIndexable<Scalar = FGenerator> + PackedExtension<FDomain>, PGenerator::Scalar: ExtensionField<PBits::Scalar> + ExtensionField<FDomain>, PChallenge: PackedField + PackedFieldIndexable<Scalar = F> + PackedExtension<PGenerator::Scalar, PackedSubfield = PGenerator> + PackedExtension<FDomain>, F: ExtensionField<PGenerator::Scalar> + ExtensionField<FDomain> + BinaryField + TowerField, FGenerator: Field + TowerField, Backend: ComputationBackend, Transcript: CanSample<F> + CanWrite,