#include <stdio.h>
#include <math.h>
double dot_product (double *a, double *b, size_t n) {
double acc=0;
for (size_t i=0; i < n; ++i)
acc += a[i]*b[i];
return acc;
}
int is_ortho (double *m, size_t n) {
for (size_t i=0; i < n; ++i) {
for (size_t j=i; j < n; ++j) {
double p=dot_product (m+i*n, m+j*n, n);
if (i
==j
) { if (fabs(p
-1) > 1e-6) return 0; } else { if ( p > 1e-6) return 0; }
}
}
return 1;
}
int main(void) {
double m1[] = { 0.96, -0.28, 0.28, 0.96 };
double m2[] = { 1, 0, 0, -1 };
double m3[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double m4[] = { 1 };
printf ("%d", is_ortho
(m1
, 2)); printf ("%d", is_ortho
(m2
, 2)); printf ("%d", is_ortho
(m3
, 3)); printf ("%d", is_ortho
(m4
, 1)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgpkb3VibGUgZG90X3Byb2R1Y3QgKGRvdWJsZSAqYSwgZG91YmxlICpiLCBzaXplX3QgbikgewogIGRvdWJsZSBhY2M9MDsKICBmb3IgKHNpemVfdCBpPTA7IGkgPCBuOyArK2kpCiAgICBhY2MgKz0gYVtpXSpiW2ldOwogIHJldHVybiBhY2M7Cn0KCmludCBpc19vcnRobyAoZG91YmxlICptLCBzaXplX3QgbikgewogIGZvciAoc2l6ZV90IGk9MDsgaSA8IG47ICsraSkgewogICAgZm9yIChzaXplX3Qgaj1pOyBqIDwgbjsgKytqKSB7CiAgICAgICBkb3VibGUgcD1kb3RfcHJvZHVjdCAobStpKm4sIG0raipuLCBuKTsKICAgICAgIGlmIChpPT1qKSB7IGlmIChmYWJzKHAtMSkgPiAxZS02KSByZXR1cm4gMDsgfQogICAgICAgZWxzZSAgICAgIHsgaWYgKCAgICAgICBwICA+IDFlLTYpIHJldHVybiAwOyB9CiAgICB9CiAgfQogIHJldHVybiAxOwp9CgppbnQgbWFpbih2b2lkKSB7Cglkb3VibGUgbTFbXSA9IHsgMC45NiwgLTAuMjgsIDAuMjgsIDAuOTYgfTsKCWRvdWJsZSBtMltdID0geyAxLCAwLCAwLCAtMSB9OwoJZG91YmxlIG0zW10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfTsKCWRvdWJsZSBtNFtdID0geyAxIH07CglwcmludGYgKCIlZCIsIGlzX29ydGhvKG0xLCAyKSk7CglwcmludGYgKCIlZCIsIGlzX29ydGhvKG0yLCAyKSk7CglwcmludGYgKCIlZCIsIGlzX29ydGhvKG0zLCAzKSk7CglwcmludGYgKCIlZCIsIGlzX29ydGhvKG00LCAxKSk7CglyZXR1cm4gMDsKfQo=