单纯的cpp程序 ,svd, 循环Jacobimethod
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void printFloatMatrixRowMajor(float* A, int M, int N, int lda);
void printFloatMatrixColMajor(float* A, int M, int N, int lda);
int jcbi_roll(float* a, int n, float* v, float eps, int jt) {
int i, j, p, q, u, w, t, s, loops;
float fm, cn, sn, omega, x, y, d;
loops = 1;
int contiCount = 0;
for (i = 0; i <= n - 1; i++)//Let V = I;
{
v[i * n + i] = 1.0;
for (j = 0; j <= n - 1; j++)
if (i != j) v[i * n + j] = 0.0;
}
while (1 == 1)
{
fm = 0.0;
for (p = 1; p <= n - 1; p++)
{
for (q = 0; q <= p - 1; q++)
{
if (loops > jt) { printf("\n\ncontiCount = %d\n", contiCount); return(-1); }// 超过迭代次数,依然没有收敛,退出,返回-1
loops = loops + 1;//loopCount++ ;
u = p * n + q; //A(p, q)
w = p * n + p; //A(p, p)
t = q * n + p; //A(q, p)
s = q * n + q; //A(q, q)
if (fabs(a[u]) < eps) { contiCount++; continue; }
//计算sin(2θ)
x = -a[u]; // m = -A(p,q)
y = (a[s] - a[w]) / 2.0; // n = 1/2(A(q,q)-A(pp))
omega = x / sqrt(x * x + y * y); // m/(sqrt(m^2 + n^2))
if (y < 0.0) omega = -omega; //sgn(n)* sin(2θ)=omega
//计算sin(θ)
sn = 1.0 + sqrt(1.0 - omega * omega);
sn = omega / sqrt(2.0 * sn); // sin(θ)
//计算cos(θ)
cn = sqrt(1.0 - sn * sn); // cos(θ)
fm = a[w]; // A(p,p)
//计算 四个元素
a[w] = fm * cn * cn + a[s] * sn * sn + a[u] * omega; // A(p,p)' = A(p,p)cos(θ)^2 + A(q,q)sin(θ)^2 + A(p,q)sin(2θ)
a[s] = fm * sn * sn + a[s] * cn * cn - a[u] * omega; // A(q,q)' = A(p,p)sin(θ)^2 + A(q,q)cos(θ)^2 - A(p,q)sin(2θ)
a[u] = 0.0; // A(p,q)' = 0;
a[t] = 0.0; // A(q,p)' = 0;
//计算第p行 和第q行
for (j = 0; j <= n - 1; j++) // updat row p and row q;
if ((j != p) && (j != q))
{
u = p * n + j; // 遍历第 p 行的每一个元素
w = q * n + j; // 遍历第 q 行的每一个元素
fm = a[u]; //
a[u] = fm * cn + a[w] * sn; // 自己的上次值 累加上 伴随行的元素上次值
a[w] = -fm * sn + a[w] * cn; // 自己的原值 累加上 伴随行的元素值
}
//计算第p列和第q列
for (i = 0; i <= n - 1; i++) // update column p and column q
if ((i != p) && (i != q))
{
u = i * n + p; // A(i, p) 遍历 p-th column
w = i * n + q; // A(i, q) 遍历 q-th column
fm = a[u]; //
a[u] = fm * cn + a[w] * sn; // 自己的上次值 累加上 伴随行的元素上次值
a[w] = -fm * sn + a[w] * cn; // 自己的上次值 累加上 伴随行的元素上次值
}
for (i = 0; i <= n - 1; i++) // update EigenVectors p-th and q-th
{
u = i * n + p; // V(i, p) 遍历 p-th column
w = i * n + q; // V(i, q) 遍历 q-th column
fm = v[u]; //
v[u] = fm * cn + v[w] * sn; //
v[w] = -fm * sn + v[w] * cn; //
}
}///LLLL
}
}
printf("\n\ncontiCount=%d\n", contiCount);
return(1);
}
int jcbi(float* a, int n, float* v, float eps, int jt){
int i, j, p, q, u, w, t, s, loops;
float fm, cn, sn, omega, x, y, d;
loops = 1;
for (i = 0; i <= n - 1; i++)//Let V = I;
{
v[i * n + i] = 1.0;
for (j = 0; j <= n - 1; j++)
if (i != j) v[i * n + j] = 0.0;
}
while (1 == 1)
{
fm = 0.0;
for (i = 1; i <= n - 1; i++) {//only check the lower triangle matrix of D_i, without the diag elements
for (j = 0; j <= i - 1; j++)// q 恒小于 p; q 不可能等于 p
{
d = fabs(a[i * n + j]);
if ((i != j) && (d > fm))
{
fm = d;//当前最大值
p = i;//行号
q = j;//列号
}
}
}
if (fm < eps) return(1);//the max element is less than eps, tolerance
if ( loops > jt) return(-1);// 超过迭代次数,依然没有收敛,退出,返回-1
loops = loops + 1;//loopCount++ ;
u = p * n + q; //A(p, q)
w = p * n + p; //A(p, p)
t = q * n + p; //A(q, p)
s = q * n + q; //A(q, q)
//计算sin(2θ)
x = -a[u]; // m = -A(p,q)
y = (a[s] - a[w]) / 2.0; // n = 1/2(A(q,q)-A(pp))
omega = x / sqrt(x * x + y * y); // m/(sqrt(m^2 + n^2))
if (y < 0.0) omega = -omega; //sgn(n)* sin(2θ)=omega
//计算sin(θ)
sn = 1.0 + sqrt(1.0 - omega * omega);
sn = omega / sqrt(2.0 * sn); // sin(θ)
//计算cos(θ)
cn = sqrt(1.0 - sn * sn); // cos(θ)
fm = a[w]; // A(p,p)
//计算 四个元素
a[w] = fm * cn * cn + a[s] * sn * sn + a[u] * omega; // A(p,p)' = A(p,p)cos(θ)^2 + A(q,q)sin(θ)^2 + A(p,q)sin(2θ)
a[s] = fm * sn * sn + a[s] * cn * cn - a[u] * omega; // A(q,q)' = A(p,p)sin(θ)^2 + A(q,q)cos(θ)^2 - A(p,q)sin(2θ)
a[u] = 0.0; // A(p,q)' = 0;
a[t] = 0.0; // A(q,p)' = 0;
//计算第p行 和第q行
for (j = 0; j <= n - 1; j++) // updat row p and row q;
if ((j != p) && (j != q))
{
u = p * n + j; // 遍历第 p 行的每一个元素
w = q * n + j; // 遍历第 q 行的每一个元素
fm = a[u]; //
a[u] = fm * cn + a[w] * sn; // 自己的上次值 累加上 伴随行的元素上次值
a[w] = -fm * sn + a[w] * cn; // 自己的原值 累加上 伴随行的元素值
}
//计算第p列和第q列
for (i = 0; i <= n - 1; i++) // update column p and column q
if ((i != p) && (i != q))
{
u = i * n + p; // A(i, p) 遍历 p-th column
w = i * n + q; // A(i, q) 遍历 q-th column
fm = a[u]; //
a[u] = fm * cn + a[w] * sn; // 自己的上次值 累加上 伴随行的元素上次值
a[w] = -fm * sn + a[w] * cn; // 自己的上次值 累加上 伴随行的元素上次值
}
for (i = 0; i <= n - 1; i++) // update EigenVectors p-th and q-th
{
u = i * n + p; // V(i, p) 遍历 p-th column
w = i * n + q; // V(i, q) 遍历 q-th column
fm = v[u]; //
v[u] = fm * cn + v[w] * sn; //
v[w] = -fm * sn + v[w] * cn; //
}
}
return(1);
}
void transpositionColMajor(float* A, int M, int N, float* At, int lda, int ldat) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
At[i + j * ldat] = A[j + i * lda];
}
}
}
void transpositionRowMajor(float* A, int M, int N, float* At, int lda, int ldat) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
At[i * ldat + j] = A[j * lda + i];
}
}
}
void SGemmColMajor(float* A, float* B, int M, int N, int K, float* C, int lda, int ldb, int ldc) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
C[i + j * ldc] = 0.0f;
for (int k = 0; k < K; k++) {
C[i + j * ldc] += A[i + k * lda] * B[k + j * ldb];
}
}
}
}
void SGemmRowMajor(float* A, float* B, int M, int N, int K, float* C, int lda, int ldb, int ldc) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
C[i * ldc + j] = 0.0f;
for (int k = 0; k < K; k++) {
C[i * ldc + j] += A[i * lda + k] * B[k * ldb + j];
}
}
}
}
void printFloatMatrixColMajor(float* A, int M, int N, int lda) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf(" %9.7f", A[i + j * lda]);
}
printf("\n\n");
}
}
void printFloatMatrixRowMajor(float* A, int M, int N, int lda) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf(" %6.4f", A[i * lda + j]);
}
printf("\n\n");
}
}
void gemmTest() {
int m, n, k;
m = 4;
n = 2;
k = 3;
float A[12] = { 5,3,6,0,2,8,0,1,4,2,4,6 };
float B[6] = { 2,1,3,4,3,2 };
float C[8] = { 0.0 };
printf("\nA=\n");
printFloatMatrixColMajor(A, m, k, m);
printf("\nB=\n");
printFloatMatrixColMajor(B, k, n, k);
SGemmColMajor(A, B, m, n, k, C, m, k, m);
printf("\nC=\n");
printFloatMatrixColMajor(C, m, n, m);
}
void transpositionTest() {
int m, n, k;
m = 4;
n = 3;
float A[12] = { 5,3,6,0,2,8,0,1,4,2,4,6 };
float At[12];
//void transpositionColMajor(float* A, int M, int N, float* At, int lda, int ldat)
transpositionColMajor(A, m, n, At, m, n);
printf("\nA=\n");
printFloatMatrixColMajor(A, m, n, m);
printf("\nAt=\n");
printFloatMatrixColMajor(At, n, m, n);
}
void svd_sym_Little_Test() {
int n = 6;
//float A[36] = { 2, -1, 0, -1, 2, -1, 0, -1, 2 };
float A[36] = {
1.9757, 2.4581, 1.4726, 1.3031, 1.5231, 0.8238,
2.4581, 3.5969, 1.9414, 2.3095, 2.3901, 1.4690,
1.4726, 1.9414, 1.5127, 1.2891, 0.9270, 0.5674,
1.3031, 2.3095, 1.2891, 1.8225, 1.4753, 1.0712,
1.5231, 2.3901, 0.9270, 1.4753, 2.0327, 0.9849,
0.8238, 1.4690, 0.5674, 1.0712, 0.9849, 0.9280
};
printf("\nA=\n");
printFloatMatrixRowMajor(A, n, n, n);
int jt;
float eps;
int result = 0;
float eigenVs[36];
jt = 100;
eps = 0.000001;
result = jcbi(A, n, eigenVs, eps, jt);
printf("\neigenValus=\n");
printFloatMatrixRowMajor(A, n, n, n);
printf("\neigenVs=\n");
printFloatMatrixRowMajor(eigenVs, n, n, n);
}
void svd_Little_mGEn_Test() {
int m, n, k;
m = 4;
n = 3;
//float A[12] = { 5,3,6,0,2,8,0,1,4,2,4,6 };
float A[12] = { 5,2,4,3,8,2,6,0,4,0,1,6 };
float At[12];
//void transpositionRowMajor(float* A, int M, int N, float* At, int lda, int ldat)
transpositionRowMajor(A, m, n, At, n, m);
printf("\nA=\n");
printFloatMatrixRowMajor(A, m, n, n);
printf("\nAt=\n");
printFloatMatrixRowMajor(At, n, m, m);
float A_x_At[16];
float At_x_A[9];
//void SGemmColMajor(float* A, float* B, int M, int N, int K, float* C, int lda, int ldb, int ldc)
SGemmRowMajor(At, A, n, n, m, At_x_A, m, n, n);
printf("\nAt_x_A=\n");
printFloatMatrixRowMajor(At_x_A, n, n, n);
int jt;
float eps;
int result = 0;
float v_At_x_A[9];
jt = 100;
eps = 0.000001;
result = jcbi(At_x_A, n, v_At_x_A, eps, jt);
printf("\nSigma in At_x_A=\n");
printFloatMatrixRowMajor(At_x_A, n, n, n);
printf("\nV of At_x_A=\n");
printFloatMatrixRowMajor(v_At_x_A, n, n, n);
}
void svd_Little_mLTn_Test() {
int m, n, k;
m = 4;
n = 3;
//float A[12] = { 5,3,6,0,2,8,0,1,4,2,4,6 };
float A[12] = { 5,2,4,3,8,2,6,0,4,0,1,6 };
float At[12];
//void transpositionColMajor(float* A, int M, int N, float* At, int lda, int ldat)
transpositionColMajor(A, m, n, At, m, n);
printf("\nA=\n");
printFloatMatrixColMajor(A, m, n, m);
printf("\nAt=\n");
printFloatMatrixColMajor(At, n, m, n);
float A_x_At[16];
float At_x_A[9];
//void SGemmColMajor(float* A, float* B, int M, int N, int K, float* C, int lda, int ldb, int ldc)
/****
SGemmColMajor(A, At, m, m, n, A_x_At, m, n, m);
printf("\nA_x_At=\n");
printFloatMatrixColMajor(A_x_At, m, m, m);
*****/
SGemmColMajor(At, A, n, n, m, At_x_A, n, m, n);
printf("\nAt_x_A=\n");
printFloatMatrixColMajor(At_x_A, n, n, n);
int jt;
float eps;
int result = 0;
float v_A_x_At[16];
float v_At_x_A[9];
jt = 100;
eps = 0.000001;
/****
result = jcbi(A_x_At, m, v_A_x_At, eps, jt);
printf("\nA_x_At=\n");
printFloatMatrixColMajor(A_x_At, m, m, m);
printf("\nV of A_x_At=\n");
printFloatMatrixColMajor(v_A_x_At, m, m, m);
*****/
result = jcbi(At_x_A, n, v_At_x_A, eps, jt);
printf("\nAt_x_A=\n");
printFloatMatrixColMajor(At_x_A, n, n, n);
printf("\nV of At_x_A=\n");
printFloatMatrixColMajor(v_At_x_A, n, n, n);
}
void printFloatVector(float* X, int n) {
for (int idx = 0; idx < n; idx++) {
printf(" %9.7e,", X[idx]);
}
printf("\n");
}
void svd_Big_Test() {
int m, n, k;
int batchSize = 1;
m = 300;
n = 181;
float* A;
float* At;
A = (float*)malloc(sizeof(float) * m * n * batchSize);
At = (float*)malloc(sizeof(float) * n * m * batchSize);
const char* fileName = "test_svd.bin";
//void transpositionColMajor(float* A, int M, int N, float* At, int lda, int ldat)
//transpositionColMajor(A, m, n, At, m, n);
FILE* fp = fopen(fileName, "rb");
if (fp == NULL) {
printf("FILE OPEN FAIL!\n");
return;
}
fread(A, sizeof(float), m * n * batchSize, fp);
//fread(A, sizeof(float), 7, fp);
transpositionColMajor(A, m, n, At, m, n);
printf("A=\n\n");
printFloatVector(A, 7);
printf("\nA=\n");
//printFloatMatrixColMajor(A, m, n, m);
printf("\nAt=\n");
//printFloatMatrixColMajor(At, n, m, n);
float* A_x_At;
float* At_x_A;
A_x_At = (float*)malloc(m * m * sizeof(float) * batchSize);
At_x_A = (float*)malloc(n * n * sizeof(float) * batchSize);
//void SGemmColMajor(float* A, float* B, int M, int N, int K, float* C, int lda, int ldb, int ldc)
SGemmColMajor(A, At, m, m, n, A_x_At, m, n, m);
printf("\nA_x_At=\n");
printFloatMatrixColMajor(A_x_At, m, m, m);
SGemmColMajor(At, A, n, n, m, At_x_A, n, m, n);
printf("\nAt_x_A=\n");
printFloatMatrixColMajor(At_x_A, n, n, n);
int jt;
float eps;
int result = 0;
float* v_A_x_At;
float* v_At_x_A;
v_A_x_At = (float*)malloc(m * m * sizeof(float) * batchSize);
v_At_x_A = (float*)malloc(n * n * sizeof(float) * batchSize);
jt = 100;
eps = 0.000001;
result = jcbi(A_x_At, m, v_A_x_At, eps, jt);
printf("\nA_x_At=\n");
printFloatMatrixColMajor(A_x_At, m, m, m);
printf("\nU of A_x_At=\n");
printFloatMatrixColMajor(v_A_x_At, m, m, m);
result = jcbi(At_x_A, n, v_At_x_A, eps, jt);
printf("\nAt_x_A=\n");
printFloatMatrixColMajor(At_x_A, n, n, n);
printf("\nV of At_x_A=\n");
printFloatMatrixColMajor(v_At_x_A, n, n, n);
/****/
}
void svd_sym_Test() {
int m, n;
m = 7;
n = 7;
float A[49] = {
6, 6, 0, 9, 7, 2, 6,
6, 5, 9, 4, 2, 5, 5,
0, 9, 8, 3, 5, 0, 6,
9, 4, 3, 8, 9, 9, 4,
7, 2, 5, 9, 0, 6, 0,
2, 5, 0, 9, 6, 4, 4,
6, 5, 6, 4, 0, 4, 9
};
/**
float A[4096] = {
9, 10, 7, 9, 2, 0, 19, 12, 16, 4, 0, 1, 12, 4, 7, 4, 14, 18, 11, 1, 12, 19, 14, 12, 12, 0, 9, 10, 3, 8, 6, 16, 15, 5, 10, 4, 10, 14, 4, 10, 13, 10, 4, 1, 7, 3, 3, 11, 1, 15, 7, 19, 19, 14, 0, 13, 4, 19, 19, 7, 6, 3, 0, 12
, 10, 14, 11, 10, 0, 11, 19, 15, 13, 19, 5, 14, 1, 3, 8, 7, 9, 14, 12, 2, 16, 14, 3, 19, 1, 2, 3, 18, 19, 9, 15, 0, 2, 18, 18, 15, 2, 14, 11, 12, 16, 11, 10, 6, 11, 5, 9, 5, 9, 1, 14, 17, 4, 4, 10, 0, 17, 7, 1, 18, 16, 5, 3, 14
, 7, 11, 16, 19, 13, 1, 2, 1, 13, 4, 15, 17, 4, 0, 1, 18, 13, 4, 14, 13, 10, 12, 12, 19, 8, 10, 0, 4, 4, 1, 17, 14, 2, 14, 9, 14, 15, 2, 18, 13, 16, 2, 15, 7, 14, 4, 1, 0, 2, 8, 1, 1, 3, 6, 17, 9, 15, 12, 4, 4, 13, 8, 14, 1
, 9, 10, 19, 0, 2, 4, 11, 16, 6, 6, 18, 6, 16, 2, 9, 11, 5, 4, 5, 1, 11, 9, 13, 3, 2, 3, 3, 16, 6, 9, 11, 0, 19, 11, 10, 13, 6, 6, 13, 3, 12, 6, 18, 4, 8, 9, 13, 14, 13, 16, 19, 14, 12, 11, 18, 11, 9, 5, 4, 9, 3, 4, 4, 1
, 2, 0, 13, 2, 10, 11, 16, 19, 17, 17, 11, 15, 15, 19, 19, 10, 2, 13, 1, 9, 2, 6, 4, 9, 17, 9, 17, 5, 12, 16, 9, 5, 18, 7, 6, 12, 9, 18, 13, 8, 12, 9, 10, 0, 8, 12, 14, 17, 0, 5, 14, 8, 11, 9, 0, 4, 2, 5, 0, 5, 1, 0, 7, 8
, 0, 11, 1, 4, 11, 10, 11, 15, 8, 15, 17, 6, 9, 3, 16, 4, 16, 0, 15, 16, 4, 0, 18, 3, 9, 14, 6, 7, 11, 1, 11, 17, 4, 15, 10, 13, 6, 15, 14, 12, 5, 3, 6, 1, 4, 7, 9, 16, 12, 2, 17, 8, 7, 5, 17, 6, 3, 14, 1, 16, 4, 13, 10, 10
, 19, 19, 2, 11, 16, 11, 5, 5, 7, 6, 17, 12, 5, 14, 16, 18, 19, 6, 16, 16, 19, 9, 1, 0, 9, 6, 15, 7, 18, 6, 18, 4, 8, 12, 16, 15, 13, 7, 11, 8, 12, 3, 1, 19, 8, 13, 8, 6, 6, 9, 11, 11, 11, 7, 16, 2, 19, 14, 16, 19, 5, 7, 6, 8
, 12, 15, 1, 16, 19, 15, 5, 2, 3, 17, 10, 0, 9, 7, 6, 9, 1, 6, 7, 16, 16, 17, 17, 9, 18, 4, 2, 9, 16, 1, 16, 4, 0, 5, 18, 6, 0, 6, 12, 14, 4, 8, 19, 3, 7, 5, 7, 11, 12, 15, 13, 8, 6, 15, 11, 18, 11, 7, 6, 3, 17, 16, 17, 4
, 16, 13, 13, 6, 17, 8, 7, 3, 0, 7, 13, 2, 8, 12, 19, 5, 14, 1, 4, 17, 0, 5, 8, 13, 6, 0, 17, 7, 8, 5, 4, 14, 12, 2, 14, 1, 1, 0, 5, 13, 10, 9, 6, 1, 17, 8, 5, 6, 10, 14, 3, 5, 6, 0, 7, 4, 8, 17, 19, 10, 6, 2, 7, 12
, 4, 19, 4, 6, 17, 15, 6, 17, 7, 12, 4, 1, 12, 1, 9, 5, 10, 0, 16, 1, 3, 0, 0, 18, 7, 4, 7, 11, 0, 14, 2, 15, 2, 2, 11, 9, 11, 16, 8, 16, 9, 7, 17, 9, 4, 3, 1, 5, 7, 19, 5, 5, 9, 17, 14, 10, 15, 19, 5, 9, 15, 0, 10, 19
, 0, 5, 15, 18, 11, 17, 17, 10, 13, 4, 3, 10, 2, 17, 19, 6, 5, 5, 4, 18, 8, 15, 14, 18, 9, 2, 2, 18, 10, 17, 14, 7, 13, 1, 11, 6, 17, 6, 1, 18, 9, 4, 15, 11, 4, 11, 16, 18, 3, 9, 18, 2, 2, 1, 4, 17, 4, 16, 14, 5, 6, 19, 15, 18
, 1, 14, 17, 6, 15, 6, 12, 0, 2, 1, 10, 4, 19, 5, 6, 19, 4, 1, 0, 2, 1, 9, 2, 12, 5, 17, 6, 9, 14, 14, 2, 4, 17, 4, 2, 6, 10, 18, 5, 8, 10, 14, 18, 13, 8, 7, 1, 1, 6, 14, 17, 4, 19, 12, 4, 15, 15, 16, 3, 11, 9, 3, 10, 1
, 12, 1, 4, 16, 15, 9, 5, 9, 8, 12, 2, 19, 9, 6, 11, 7, 15, 5, 7, 19, 5, 1, 12, 8, 13, 3, 14, 11, 16, 10, 10, 13, 17, 9, 11, 19, 12, 4, 8, 18, 10, 10, 0, 3, 5, 0, 0, 19, 5, 5, 16, 19, 18, 4, 2, 17, 8, 1, 3, 17, 10, 7, 0, 2
, 4, 3, 0, 2, 19, 3, 14, 7, 12, 1, 17, 5, 6, 4, 7, 2, 6, 2, 7, 1, 16, 10, 14, 1, 1, 6, 17, 7, 19, 8, 10, 0, 0, 10, 13, 5, 0, 0, 13, 18, 13, 14, 1, 11, 12, 8, 16, 8, 2, 17, 3, 13, 19, 1, 6, 0, 7, 12, 8, 6, 15, 7, 9, 19
, 7, 8, 1, 9, 19, 16, 16, 6, 19, 9, 19, 6, 11, 7, 16, 11, 14, 0, 7, 15, 7, 4, 1, 9, 5, 18, 8, 1, 0, 0, 17, 1, 1, 3, 12, 1, 17, 19, 14, 11, 10, 0, 17, 0, 11, 1, 14, 19, 17, 0, 7, 11, 16, 5, 10, 4, 2, 1, 10, 14, 15, 3, 7, 12
, 4, 7, 18, 11, 10, 4, 18, 9, 5, 5, 6, 19, 7, 2, 11, 14, 15, 7, 8, 10, 15, 10, 0, 10, 14, 16, 14, 4, 13, 13, 9, 19, 4, 15, 18, 12, 14, 5, 3, 0, 13, 12, 14, 3, 6, 19, 0, 6, 14, 13, 8, 12, 2, 7, 13, 16, 0, 0, 5, 16, 2, 8, 9, 11
, 14, 9, 13, 5, 2, 16, 19, 1, 14, 10, 5, 4, 15, 6, 14, 15, 7, 3, 14, 2, 10, 15, 16, 0, 7, 8, 4, 17, 10, 3, 19, 15, 0, 7, 2, 14, 1, 4, 8, 18, 14, 4, 5, 10, 4, 17, 17, 6, 11, 4, 7, 3, 7, 9, 6, 15, 6, 10, 19, 19, 19, 7, 6, 5
, 18, 14, 4, 4, 13, 0, 6, 6, 1, 0, 5, 1, 5, 2, 0, 7, 3, 2, 3, 0, 5, 2, 13, 8, 19, 8, 17, 3, 4, 11, 19, 17, 17, 10, 19, 15, 15, 15, 7, 8, 7, 1, 17, 16, 18, 4, 18, 8, 11, 8, 8, 4, 9, 12, 16, 3, 13, 6, 19, 13, 9, 5, 15, 8
, 11, 12, 14, 5, 1, 15, 16, 7, 4, 16, 4, 0, 7, 7, 7, 8, 14, 3, 10, 3, 0, 4, 2, 12, 18, 1, 15, 6, 4, 6, 5, 18, 0, 9, 16, 2, 17, 15, 9, 7, 15, 8, 19, 0, 16, 15, 16, 0, 2, 17, 12, 0, 6, 3, 11, 2, 10, 18, 16, 18, 16, 18, 6, 6
, 1, 2, 13, 1, 9, 16, 16, 16, 17, 1, 18, 2, 19, 1, 15, 10, 2, 0, 3, 16, 18, 4, 19, 11, 14, 13, 2, 3, 18, 6, 16, 7, 10, 2, 18, 4, 15, 9, 12, 18, 0, 7, 18, 1, 14, 8, 7, 2, 9, 4, 15, 4, 1, 0, 16, 2, 15, 1, 15, 14, 0, 13, 4, 3
, 12, 16, 10, 11, 2, 4, 19, 16, 0, 3, 8, 1, 5, 16, 7, 15, 10, 5, 0, 18, 2, 14, 14, 3, 14, 14, 9, 10, 3, 4, 6, 13, 1, 9, 10, 16, 6, 12, 4, 5, 14, 8, 2, 18, 18, 0, 4, 11, 4, 7, 3, 11, 16, 8, 4, 8, 19, 1, 3, 1, 17, 16, 14, 4
, 19, 14, 12, 9, 6, 0, 9, 17, 5, 0, 15, 9, 1, 10, 4, 10, 15, 2, 4, 4, 14, 12, 6, 8, 0, 4, 18, 5, 5, 10, 10, 13, 13, 8, 13, 18, 0, 12, 13, 0, 12, 1, 5, 14, 7, 11, 11, 12, 1, 3, 10, 4, 4, 10, 6, 0, 7, 12, 4, 2, 9, 1, 18, 16
, 14, 3, 12, 13, 4, 18, 1, 17, 8, 0, 14, 2, 12, 14, 1, 0, 16, 13, 2, 19, 14, 6, 7, 16, 1, 11, 16, 11, 18, 15, 3, 18, 1, 12, 19, 1, 9, 8, 10, 3, 7, 9, 5, 4, 18, 9, 3, 8, 19, 0, 3, 2, 5, 2, 2, 1, 5, 3, 19, 2, 2, 8, 4, 16
, 12, 19, 19, 3, 9, 3, 0, 9, 13, 18, 18, 12, 8, 1, 9, 10, 0, 8, 12, 11, 3, 8, 16, 13, 5, 1, 16, 14, 9, 7, 17, 8, 4, 16, 19, 2, 19, 19, 16, 15, 6, 1, 2, 5, 0, 8, 19, 12, 2, 8, 0, 3, 4, 16, 16, 8, 1, 14, 17, 0, 16, 19, 19, 4
, 12, 1, 8, 2, 17, 9, 9, 18, 6, 7, 9, 5, 13, 1, 5, 14, 7, 19, 18, 14, 14, 0, 1, 5, 9, 0, 2, 5, 8, 14, 7, 6, 19, 0, 15, 16, 10, 7, 18, 9, 9, 11, 5, 18, 7, 13, 6, 12, 3, 4, 18, 7, 5, 1, 12, 11, 19, 3, 6, 18, 2, 15, 19, 7
, 0, 2, 10, 3, 9, 14, 6, 4, 0, 4, 2, 17, 3, 6, 18, 16, 8, 8, 1, 13, 14, 4, 11, 1, 0, 17, 19, 4, 18, 16, 13, 19, 17, 19, 15, 17, 7, 2, 7, 3, 7, 0, 7, 9, 19, 4, 4, 1, 5, 8, 11, 5, 16, 8, 14, 7, 17, 8, 18, 17, 5, 2, 18, 3
, 9, 3, 0, 3, 17, 6, 15, 2, 17, 7, 2, 6, 14, 17, 8, 14, 4, 17, 15, 2, 9, 18, 16, 16, 2, 19, 1, 18, 19, 19, 13, 2, 4, 13, 2, 19, 8, 9, 2, 0, 5, 10, 16, 6, 3, 4, 8, 6, 17, 0, 13, 11, 16, 8, 17, 3, 6, 3, 5, 16, 6, 13, 12, 19
, 10, 18, 4, 16, 5, 7, 7, 9, 7, 11, 18, 9, 11, 7, 1, 4, 17, 3, 6, 3, 10, 5, 11, 14, 5, 4, 18, 17, 8, 19, 17, 1, 9, 4, 18, 5, 0, 10, 5, 2, 2, 16, 2, 10, 6, 2, 15, 12, 18, 17, 11, 11, 6, 10, 18, 9, 14, 19, 17, 14, 2, 7, 13, 14
, 3, 19, 4, 6, 12, 11, 18, 16, 8, 0, 10, 14, 16, 19, 0, 13, 10, 4, 4, 18, 3, 5, 18, 9, 8, 18, 19, 8, 0, 1, 16, 16, 6, 17, 8, 4, 1, 10, 17, 6, 3, 3, 8, 13, 10, 12, 15, 15, 0, 10, 13, 17, 18, 12, 5, 12, 7, 10, 14, 15, 10, 3, 19, 4
, 8, 9, 1, 9, 16, 1, 6, 1, 5, 14, 17, 14, 10, 8, 0, 13, 3, 11, 6, 6, 4, 10, 15, 7, 14, 16, 19, 19, 1, 19, 10, 6, 16, 16, 5, 13, 17, 8, 18, 19, 16, 4, 7, 17, 13, 5, 3, 0, 16, 17, 12, 0, 5, 13, 2, 18, 15, 1, 19, 7, 4, 3, 7, 10
, 6, 15, 17, 11, 9, 11, 18, 16, 4, 2, 14, 2, 10, 10, 17, 9, 19, 19, 5, 16, 6, 10, 3, 17, 7, 13, 13, 17, 16, 10, 15, 17, 4, 6, 10, 10, 19, 5, 17, 9, 19, 17, 12, 10, 6, 18, 2, 19, 3, 3, 15, 15, 13, 18, 8, 16, 12, 14, 8, 10, 18, 1, 2, 10
, 16, 0, 14, 0, 5, 17, 4, 4, 14, 15, 7, 4, 13, 0, 1, 19, 15, 17, 18, 7, 13, 13, 18, 8, 6, 19, 2, 1, 16, 6, 17, 6, 6, 8, 17, 5, 9, 11, 15, 7, 12, 12, 10, 3, 11, 11, 3, 4, 3, 5, 12, 0, 10, 8, 17, 14, 2, 4, 2, 13, 7, 16, 15, 9
, 15, 2, 2, 19, 18, 4, 8, 0, 12, 2, 13, 17, 17, 0, 1, 4, 0, 17, 0, 10, 1, 13, 1, 4, 19, 17, 4, 9, 6, 16, 4, 6, 18, 7, 5, 1, 19, 5, 16, 18, 11, 4, 5, 12, 17, 2, 10, 4, 13, 3, 4, 19, 14, 7, 14, 18, 14, 9, 14, 11, 0, 18, 7, 18
, 5, 18, 14, 11, 7, 15, 12, 5, 2, 2, 1, 4, 9, 10, 3, 15, 7, 10, 9, 2, 9, 8, 12, 16, 0, 19, 13, 4, 17, 16, 6, 8, 7, 6, 1, 18, 8, 1, 17, 15, 0, 15, 9, 3, 1, 4, 7, 19, 13, 4, 2, 9, 11, 1, 13, 13, 4, 19, 5, 8, 16, 0, 5, 9
, 10, 18, 9, 10, 6, 10, 16, 18, 14, 11, 11, 2, 11, 13, 12, 18, 2, 19, 16, 18, 10, 13, 19, 19, 15, 15, 2, 18, 8, 5, 10, 17, 5, 1, 12, 6, 19, 13, 7, 18, 0, 7, 10, 3, 4, 9, 3, 16, 0, 0, 3, 13, 8, 10, 9, 8, 15, 14, 8, 5, 14, 4, 19, 16
, 4, 15, 14, 13, 12, 13, 15, 6, 1, 9, 6, 6, 19, 5, 1, 12, 14, 15, 2, 4, 16, 18, 1, 2, 16, 17, 19, 5, 4, 13, 10, 5, 1, 18, 6, 16, 17, 2, 3, 15, 0, 6, 5, 5, 15, 9, 17, 10, 12, 2, 8, 18, 1, 3, 5, 4, 18, 7, 16, 4, 14, 4, 10, 3
, 10, 2, 15, 6, 9, 6, 13, 0, 1, 11, 17, 10, 12, 0, 17, 14, 1, 15, 17, 15, 6, 0, 9, 19, 10, 7, 8, 0, 1, 17, 19, 9, 19, 8, 19, 17, 14, 0, 12, 2, 7, 18, 2, 3, 0, 14, 7, 5, 9, 17, 7, 0, 4, 8, 9, 13, 9, 0, 15, 8, 14, 10, 16, 16
, 14, 14, 2, 6, 18, 15, 7, 6, 0, 16, 6, 18, 4, 0, 19, 5, 4, 15, 15, 9, 12, 12, 8, 19, 7, 2, 9, 10, 10, 8, 5, 11, 5, 1, 13, 2, 0, 4, 15, 1, 1, 10, 2, 17, 16, 17, 3, 13, 9, 10, 7, 17, 13, 3, 14, 11, 0, 3, 16, 12, 9, 12, 8, 6
, 4, 11, 18, 13, 13, 14, 11, 12, 5, 8, 1, 5, 8, 13, 14, 3, 8, 7, 9, 12, 4, 13, 10, 16, 18, 7, 2, 5, 17, 18, 17, 15, 16, 17, 7, 3, 12, 15, 1, 10, 15, 7, 1, 9, 9, 17, 4, 15, 12, 3, 15, 14, 14, 8, 4, 4, 16, 7, 14, 18, 13, 15, 4, 9
, 10, 12, 13, 3, 8, 12, 8, 14, 13, 16, 18, 8, 18, 18, 11, 0, 18, 8, 7, 18, 5, 0, 3, 15, 9, 3, 0, 2, 6, 19, 9, 7, 18, 15, 18, 15, 2, 1, 10, 10, 1, 16, 19, 14, 7, 11, 19, 8, 19, 8, 16, 6, 14, 19, 13, 9, 11, 18, 2, 16, 7, 5, 4, 4
, 13, 16, 16, 12, 12, 5, 12, 4, 10, 9, 9, 10, 10, 13, 10, 13, 14, 7, 15, 0, 14, 12, 7, 6, 9, 7, 5, 2, 3, 16, 19, 12, 11, 0, 0, 0, 7, 1, 15, 1, 3, 9, 1, 18, 3, 12, 7, 3, 3, 6, 11, 0, 8, 0, 19, 2, 0, 6, 8, 15, 12, 11, 19, 15
, 10, 11, 2, 6, 9, 3, 3, 8, 9, 7, 4, 14, 10, 14, 0, 12, 4, 1, 8, 7, 8, 1, 9, 1, 11, 0, 10, 16, 3, 4, 17, 12, 4, 15, 7, 6, 18, 10, 7, 16, 9, 7, 17, 13, 11, 18, 13, 1, 19, 11, 10, 17, 0, 12, 14, 10, 15, 12, 15, 15, 11, 10, 10, 5
, 4, 10, 15, 18, 10, 6, 1, 19, 6, 17, 15, 18, 0, 1, 17, 14, 5, 17, 19, 18, 2, 5, 5, 2, 5, 7, 16, 2, 8, 7, 12, 10, 5, 9, 10, 5, 2, 2, 1, 19, 1, 17, 16, 19, 2, 18, 15, 1, 4, 15, 14, 18, 15, 3, 16, 16, 17, 18, 18, 7, 3, 11, 7, 4
, 1, 6, 7, 4, 0, 1, 19, 3, 1, 9, 11, 13, 3, 11, 0, 3, 10, 16, 0, 1, 18, 14, 4, 5, 18, 9, 6, 10, 13, 17, 10, 3, 12, 3, 3, 5, 3, 17, 9, 14, 18, 13, 19, 15, 0, 19, 11, 13, 9, 15, 3, 12, 10, 4, 14, 1, 9, 12, 0, 12, 10, 8, 10, 18
, 7, 11, 14, 8, 8, 4, 8, 7, 17, 4, 4, 8, 5, 12, 11, 6, 4, 18, 16, 14, 18, 7, 18, 0, 7, 19, 3, 6, 10, 13, 6, 11, 17, 1, 4, 15, 0, 16, 9, 7, 3, 11, 2, 0, 15, 5, 19, 0, 1, 19, 1, 9, 2, 14, 0, 15, 0, 8, 11, 15, 2, 1, 10, 9
, 3, 5, 4, 9, 12, 7, 13, 5, 8, 3, 11, 7, 0, 8, 1, 19, 17, 4, 15, 8, 0, 11, 9, 8, 13, 4, 4, 2, 12, 5, 18, 11, 2, 4, 9, 9, 14, 17, 17, 11, 12, 18, 18, 19, 5, 14, 5, 18, 4, 15, 8, 10, 12, 14, 6, 18, 10, 5, 17, 6, 18, 19, 0, 16
, 3, 9, 1, 13, 14, 9, 8, 7, 5, 1, 16, 1, 0, 16, 14, 0, 17, 18, 16, 7, 4, 11, 3, 19, 6, 4, 8, 15, 15, 3, 2, 3, 10, 7, 3, 17, 7, 3, 4, 19, 7, 13, 15, 11, 19, 5, 1, 7, 10, 12, 16, 4, 16, 15, 18, 19, 12, 14, 12, 6, 3, 8, 16, 16
, 11, 5, 0, 14, 17, 16, 6, 11, 6, 5, 18, 1, 19, 8, 19, 6, 6, 8, 0, 2, 11, 12, 8, 12, 12, 1, 6, 12, 15, 0, 19, 4, 4, 19, 16, 10, 5, 13, 15, 8, 3, 1, 1, 13, 0, 18, 7, 14, 10, 15, 18, 9, 3, 12, 13, 1, 7, 0, 3, 6, 5, 10, 9, 5
, 1, 9, 2, 13, 0, 12, 6, 12, 10, 7, 3, 6, 5, 2, 17, 14, 11, 11, 2, 9, 4, 1, 19, 2, 3, 5, 17, 18, 0, 16, 3, 3, 13, 13, 0, 12, 9, 9, 12, 19, 3, 19, 4, 9, 1, 4, 10, 10, 7, 2, 19, 1, 5, 2, 19, 11, 11, 16, 17, 4, 16, 2, 4, 19
, 15, 1, 8, 16, 5, 2, 9, 15, 14, 19, 9, 14, 5, 17, 0, 13, 4, 8, 17, 4, 7, 3, 0, 8, 4, 8, 0, 17, 10, 17, 3, 5, 3, 4, 0, 2, 17, 10, 3, 8, 6, 11, 15, 15, 19, 15, 12, 15, 2, 19, 13, 1, 9, 1, 13, 13, 19, 6, 0, 10, 9, 9, 9, 1
, 7, 14, 1, 19, 14, 17, 11, 13, 3, 5, 18, 17, 16, 3, 7, 8, 7, 8, 12, 15, 3, 10, 3, 0, 18, 11, 13, 11, 13, 12, 15, 12, 4, 2, 3, 8, 7, 7, 15, 16, 11, 10, 14, 3, 1, 8, 16, 18, 19, 13, 0, 15, 3, 12, 8, 8, 15, 5, 19, 16, 16, 7, 12, 4
, 19, 17, 1, 14, 8, 8, 11, 8, 5, 5, 2, 4, 19, 13, 11, 12, 3, 4, 0, 4, 11, 4, 2, 3, 7, 5, 11, 11, 17, 0, 15, 0, 19, 9, 13, 18, 0, 17, 14, 6, 0, 17, 18, 12, 9, 10, 4, 9, 1, 1, 15, 17, 18, 7, 15, 11, 8, 13, 18, 0, 3, 8, 18, 7
, 19, 4, 3, 12, 11, 7, 11, 6, 6, 9, 2, 19, 18, 19, 16, 2, 7, 9, 6, 1, 16, 4, 5, 4, 5, 16, 16, 6, 18, 5, 13, 10, 14, 11, 8, 1, 4, 13, 14, 14, 8, 0, 15, 10, 2, 12, 16, 3, 5, 9, 3, 18, 12, 10, 10, 12, 0, 4, 15, 18, 4, 18, 4, 10
, 14, 4, 6, 11, 9, 5, 7, 15, 0, 17, 1, 12, 4, 1, 5, 7, 9, 12, 3, 0, 8, 10, 2, 16, 1, 8, 8, 10, 12, 13, 18, 8, 7, 1, 10, 3, 8, 3, 8, 19, 0, 12, 3, 4, 14, 14, 15, 12, 2, 1, 12, 7, 10, 0, 9, 6, 9, 2, 8, 4, 18, 17, 8, 10
, 0, 10, 17, 18, 0, 17, 16, 11, 7, 14, 4, 4, 2, 6, 10, 13, 6, 16, 11, 16, 4, 6, 2, 16, 12, 14, 17, 18, 5, 2, 8, 17, 14, 13, 9, 5, 9, 14, 4, 13, 19, 14, 16, 14, 0, 6, 18, 13, 19, 13, 8, 15, 10, 9, 16, 4, 9, 12, 5, 0, 8, 19, 17, 1
, 13, 0, 9, 11, 4, 6, 2, 18, 4, 10, 17, 15, 17, 0, 4, 16, 15, 3, 2, 2, 8, 0, 1, 8, 11, 7, 3, 9, 12, 18, 16, 14, 18, 13, 8, 4, 13, 11, 4, 9, 2, 10, 16, 1, 15, 18, 19, 1, 11, 13, 8, 11, 12, 6, 4, 11, 19, 17, 18, 8, 1, 0, 0, 18
, 4, 17, 15, 9, 2, 3, 19, 11, 8, 15, 4, 15, 8, 7, 2, 0, 6, 13, 10, 15, 19, 7, 5, 1, 19, 17, 6, 14, 7, 15, 12, 2, 14, 4, 15, 18, 9, 0, 16, 11, 0, 15, 17, 9, 0, 10, 12, 7, 11, 19, 15, 8, 0, 9, 9, 19, 12, 9, 8, 8, 18, 11, 7, 19
, 19, 7, 12, 5, 5, 14, 14, 7, 17, 19, 16, 16, 1, 12, 1, 0, 10, 6, 18, 1, 1, 12, 3, 14, 3, 8, 3, 19, 10, 1, 14, 4, 9, 19, 14, 7, 0, 3, 7, 18, 6, 12, 18, 12, 8, 5, 14, 0, 16, 6, 5, 13, 4, 2, 12, 17, 9, 8, 7, 9, 6, 11, 7, 6
, 19, 1, 4, 4, 0, 1, 16, 6, 19, 5, 14, 3, 3, 8, 10, 5, 19, 19, 16, 15, 3, 4, 19, 17, 6, 18, 5, 17, 14, 19, 8, 2, 14, 5, 8, 16, 15, 16, 14, 2, 8, 15, 18, 0, 11, 17, 12, 3, 17, 0, 19, 18, 15, 8, 5, 18, 8, 7, 7, 19, 2, 8, 16, 2
, 7, 18, 4, 9, 5, 16, 19, 3, 10, 9, 5, 11, 17, 6, 14, 16, 19, 13, 18, 14, 1, 2, 2, 0, 18, 17, 16, 14, 15, 7, 10, 13, 11, 8, 5, 4, 8, 12, 18, 16, 15, 15, 7, 12, 15, 6, 6, 6, 4, 10, 16, 0, 18, 4, 0, 8, 8, 9, 19, 9, 7, 5, 15, 10
, 6, 16, 13, 3, 1, 4, 5, 17, 6, 15, 6, 9, 10, 15, 15, 2, 19, 9, 16, 0, 17, 9, 2, 16, 2, 5, 6, 2, 10, 4, 18, 7, 0, 16, 14, 14, 14, 9, 13, 7, 12, 11, 3, 10, 2, 18, 3, 5, 16, 9, 16, 3, 4, 18, 8, 1, 18, 6, 2, 7, 15, 11, 11, 2
, 3, 5, 8, 4, 0, 13, 7, 16, 2, 0, 19, 3, 7, 7, 3, 8, 7, 5, 18, 13, 16, 1, 8, 19, 15, 2, 13, 7, 3, 3, 1, 16, 18, 0, 4, 4, 10, 12, 15, 5, 11, 10, 11, 8, 1, 19, 8, 10, 2, 9, 7, 8, 18, 17, 19, 0, 11, 11, 8, 5, 11, 2, 17, 1
, 0, 3, 14, 4, 7, 10, 6, 17, 7, 10, 15, 10, 0, 9, 7, 9, 6, 15, 6, 4, 14, 18, 4, 19, 19, 18, 12, 13, 19, 7, 2, 15, 7, 5, 19, 10, 16, 8, 4, 4, 19, 10, 7, 10, 10, 0, 16, 9, 4, 9, 12, 18, 4, 8, 17, 0, 7, 7, 16, 15, 11, 17, 18, 18
, 12, 14, 1, 1, 8, 10, 8, 4, 12, 19, 18, 1, 2, 19, 12, 11, 5, 8, 6, 3, 4, 16, 16, 4, 7, 3, 19, 14, 4, 10, 10, 9, 18, 9, 16, 3, 16, 6, 9, 4, 15, 5, 4, 18, 9, 16, 16, 5, 19, 1, 4, 7, 10, 10, 1, 18, 19, 6, 2, 10, 2, 1, 18, 14
};
*/
/**
float A[441] = {
13, 20, 16, 7, 29, 0, 23, 4, 6, 2, 1, 15, 21, 3, 27, 1, 20, 23, 6, 21, 4
, 20, 1, 8, 16, 24, 28, 18, 8, 4, 26, 13, 19, 6, 12, 24, 27, 6, 22, 6, 17, 9
, 16, 8, 21, 11, 20, 9, 11, 10, 13, 7, 22, 10, 7, 19, 8, 28, 26, 20, 22, 19, 16
, 7, 16, 11, 25, 16, 13, 26, 2, 13, 18, 2, 18, 9, 14, 1, 27, 19, 6, 0, 18, 26
, 29, 24, 20, 16, 23, 6, 26, 1, 10, 27, 6, 16, 14, 20, 23, 29, 24, 0, 17, 9, 1
, 0, 28, 9, 13, 6, 18, 4, 27, 18, 28, 20, 13, 2, 20, 10, 4, 6, 6, 5, 11, 25
, 23, 18, 11, 26, 26, 4, 16, 8, 7, 28, 26, 10, 19, 24, 15, 2, 23, 23, 24, 22, 29
, 4, 8, 10, 2, 1, 27, 8, 28, 20, 17, 18, 1, 26, 25, 25, 16, 22, 15, 15, 1, 24
, 6, 4, 13, 13, 10, 18, 7, 20, 15, 27, 23, 2, 23, 15, 14, 26, 20, 14, 9, 14, 15
, 2, 26, 7, 18, 27, 28, 28, 17, 27, 7, 5, 11, 28, 18, 25, 23, 5, 6, 12, 12, 12
, 1, 13, 22, 2, 6, 20, 26, 18, 23, 5, 7, 22, 13, 14, 11, 0, 17, 23, 3, 8, 29
, 15, 19, 10, 18, 16, 13, 10, 1, 2, 11, 22, 25, 13, 25, 12, 18, 14, 7, 23, 2, 16
, 21, 6, 7, 9, 14, 2, 19, 26, 23, 28, 13, 13, 3, 10, 25, 6, 26, 28, 14, 9, 5
, 3, 12, 19, 14, 20, 20, 24, 25, 15, 18, 14, 25, 10, 0, 4, 29, 23, 0, 24, 6, 23
, 27, 24, 8, 1, 23, 10, 15, 25, 14, 25, 11, 12, 25, 4, 10, 9, 9, 7, 5, 22, 2
, 1, 27, 28, 27, 29, 4, 2, 16, 26, 23, 0, 18, 6, 29, 9, 14, 22, 19, 8, 16, 29
, 20, 6, 26, 19, 24, 6, 23, 22, 20, 5, 17, 14, 26, 23, 9, 22, 28, 20, 25, 29, 13
, 23, 22, 20, 6, 0, 6, 23, 15, 14, 6, 23, 7, 28, 0, 7, 19, 20, 5, 15, 13, 13
, 6, 6, 22, 0, 17, 5, 24, 15, 9, 12, 3, 23, 14, 24, 5, 8, 25, 15, 17, 27, 18
, 21, 17, 19, 18, 9, 11, 22, 1, 14, 12, 8, 2, 9, 6, 22, 16, 29, 13, 27, 3, 23
, 4, 9, 16, 26, 1, 25, 29, 24, 15, 12, 29, 16, 5, 23, 2, 29, 13, 13, 18, 23, 22
};
*/
printf("\nA=\n");
printFloatMatrixRowMajor(A, m, n, n);
int jt;
float eps;
int result = 0;
float v_A[49];
jt = 89;
eps = 0.000001;
//result = jcbi(A, n, v_A, eps, jt);
result = jcbi_roll(A, n, v_A, eps, jt);
printf("\nSigma_A=\n");
printFloatMatrixRowMajor(A, n, n, n);
printf("\nV_A=\n");
printFloatMatrixRowMajor(v_A, n, n, n);
}
int main() {
svd_sym_Test();
//svd_Little_mGEn_Test();// A'*A => V S
return 0;
}