Ваша процедура не обязательно создаст вектор, который ортогонален всем нам.
Например, если нас было только 2, а мы не были ортогональны. Тогда после первого шага у вас будет вектор, ортогональный к u1, но затем на втором шаге (если случайно вектор уже не ортогонален к u2) вычтите кратное u2 из вектора, и так как u1.u2! = 0, результат больше не будет ортогональным к u1.
Сначала нужно найти набор векторов, скажем w_1..w_M (например, с помощью модифицированного Грама-Шмидта), которые ортогональны и занимают то же пространство, что и мы. Их, если вы используете свою процедуру с ws вместо us, вы вычислите вектор, который ортогонален всем ws и, следовательно, всем нам. Более того (кроме ошибок округления) это не будет зависеть от порядка сравнения *