     public let indices: [Int]
     
     public init(_ indices: [Int]) {
-        self.indices = indices.dropLast{ $0 == 0 }
+        if n.isFixed {
+            assert(indices.count == n.intValue)
+            self.indices = indices
+        } else {
+            self.indices = indices.dropLast{ $0 == 0 }
+        }
     }
     
     public init(_ indices: Int...) {

}

extension MultiIndex where n == _2 {
    public var tuple: (Int, Int) {
        (self[0], self[1])
    }
}

extension MultiIndex where n == _3 {
    public var triple: (Int, Int, Int) {
        (self[0], self[1], self[2])
    }

    }

    public static func +(c1: Self, c2: Self) -> Self {
        if n.isFixed {
            return .init( c1.indices.merging(c2.indices, mergedBy: +) )
        } else {
            return .init( c1.indices.merging(c2.indices, filledWith: 0, mergedBy: +) )
        }
    }
    
    public static prefix func -(_ c: Self) -> Self {
        .init( c.indices.map{ -$0 } )
    }

    public static func < (c1: Self, c2: Self) -> Bool {
        (c1 != c2) && (c2 - c1).indices.allSatisfy{ $0 >= 0 }
    }
