+ # Define a scaling operation that can be used on tuples.
+ # Oh and our "zero" needs to belong to the right space.
+ scale = lambda x,alpha: x*alpha
+ zero = v[0].parent().zero()
+ if hasattr(v[0], 'cartesian_factors'):
+ P = v[0].parent()
+ scale = lambda x,alpha: P(tuple( x_i*alpha
+ for x_i in x.cartesian_factors() ))
+
+
+ def proj(x,y):
+ return scale(x, (inner_product(x,y)/inner_product(x,x)))
+