         self.b3 = b3
         self.b4 = b4
     }
-    public typealias Difference = BernsteinPolynomial3
+    public typealias NextLowerOrderPolynomial = BernsteinPolynomial3
     public var b0, b1, b2, b3, b4: CGFloat
     public var coefficients: [CGFloat] { return [b0, b1, b2, b3, b4] }
     public func difference(a1: CGFloat, a2: CGFloat) -> BernsteinPolynomial3 {

        self.b4 = b4
        self.b5 = b5
    }
    public typealias Difference = BernsteinPolynomial4
    public var b0, b1, b2, b3, b4, b5: CGFloat
    public var coefficients: [CGFloat] { return [b0, b1, b2, b3, b4, b5] }
    public func difference(a1: CGFloat, a2: CGFloat) -> BernsteinPolynomial4 {

//    var last: CGFloat { get }
//    var first: CGFloat { get }
//    func enumerated(block: (Int, CGFloat) -> Void)
    associatedtype NextLowerOrderPolynomial: BernsteinPolynomial
    /// a polynomial of the next lower order where each coefficient `b[i]` is defined by `a1 * b[i] + a2 * b[i+1]`
    func difference(a1: CGFloat, a2: CGFloat) -> NextLowerOrderPolynomial
    /// reduces the polynomial by repeatedly applying `difference` until left with a constant value
    func reduce(a1: CGFloat, a2: CGFloat) -> CGFloat
    var derivative: NextLowerOrderPolynomial { get }
//    init(_ d: Difference, last: CGFloat)
//    init(first: CGFloat, _ d: Difference)
//    func reversed() -> Self
