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

    public var order: Int { return 5 }
}

private func newton<P: BernsteinPolynomial>(polynomial: P, derivative: P.Difference, guess: CGFloat, relaxation: CGFloat = 1) -> CGFloat {
    let maxIterations = 20
    var x = guess
    for _ in 0..<maxIterations {

//    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
