Skip to content
Snippets Groups Projects
Commit 922bc29b authored by Bouillaguet Charles's avatar Bouillaguet Charles
Browse files

struct task_t --> phase finale

parent 13d6914f
No related branches found
No related tags found
No related merge requests found
......@@ -40,7 +40,7 @@ int main()
task.rot[i] = (task.rot[i] + 1) % k;
}
if (solve_isgood(task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest)) {
if (solve_isgood(&task)) {
printf("candidat DS64 trouvé !!\n");
printf("temps pour trouver la solution = %f\n", wtime() - t1);
}
......
......@@ -121,14 +121,14 @@ static inline long long light_crazy_round(double x)
}
bool solve_isgood(const char* goodY, const int* rot, const u64* tabTmp, const u64* sumPolY, const u64* sumPolTest)
bool solve_isgood(const struct task_t *task)
{
/**** Recherche du DS640 ****/
u64 tmp[nbiter];
for (int i = 0; i < nbiter; i++) //Y
tmp[i] = tabTmp[i + nbiter * rot[i]];
tmp[i] = task->tabTmp[i + nbiter * task->rot[i]];
u64 Y0 = tmp[0] + sumPolY[0];
u64 Y0 = tmp[0] + task->sumPolY[0];
double tmp3[nbiter - 1];
for (int i = 0; i < nbiter - 1; i++) //DY
......@@ -147,20 +147,20 @@ bool solve_isgood(const char* goodY, const int* rot, const u64* tabTmp, const u6
DS640 += Greduite[i] * light_crazy_round(u[i]);
}
return confirm(Y0, DS640, sumPolTest, goodY);
return confirm(Y0, DS640, task->sumPolTest, task->goodY);
}
void solve(u64* DS640, u64* Y0, char* goodY, int* rot, u64* tabTmp, u64* sumPolY, u64* sumPolTest)
void solve(const struct task_t *task, u64* DS640, u64* Y0)
{
u64 tmp[nbiter];
/**** Recherche du DS640 ****/
for (int i = 0; i < nbiter; i++) //Y
tmp[i] = tabTmp[i + nbiter * rot[i]];
tmp[i] = task->tabTmp[i + nbiter * task->rot[i]];
*Y0 = (tmp[0] + sumPolY[0]) % (1 << (known_low + known_up));
*Y0 = (tmp[0] + task->sumPolY[0]) % (1 << (known_low + known_up));
u64 tmp3[nbiter - 1];
for(int i = 0; i < nbiter - 1; i++) //DY
......@@ -178,7 +178,7 @@ void solve(u64* DS640, u64* Y0, char* goodY, int* rot, u64* tabTmp, u64* sumPolY
(*DS640) += Greduite[i] * crazy_round(u[i]);
}
assert(confirm(*Y0, *DS640, sumPolTest, goodY));
assert(confirm(*Y0, *DS640, task->sumPolTest, task->goodY));
}
......
......@@ -40,6 +40,8 @@ void init_task(struct task_t *t);
void prepare_task(const u64 *X, u64 W0, u64 WC, struct task_t *t);
void finish_task(const u64 *X, struct task_t *t);
double wtime();
bool solve_isgood(const struct task_t *task);
void solve(const struct task_t *task, u64* DS640, u64* Y0);
static inline void prodMatVecFFU(double* res, double* M, u64* v, int n){
int i, j;
......@@ -71,22 +73,17 @@ static inline u64 unrotate(u64 Xi, int i)
return (Xi >> (k-i)) | (Xi << i);
}
char* setupGoodY();
void getGoodY(char* goodY, const u64* X, const u64* lowSumPol, int v);
void getTabTmp(u64* tabTmp, const u64* X, const u64* lowSumPol, const u64* sumPolY);
void getY(u64 *Y, u64 W0, u64 WC, int* rot, u64* uX);
void getYprim(u64 *Yprim, u64 *Y, u64 W0, u64 WC);
void getDY(u64 *DY, u64* Yprim);
void FindDS64(u64* DS64, u64 *Y0, u64* uX,int* rot, u64* lowSumPol, u64* sumPolY);
u64 FindDS640(u64* Y, u64* uX, int* rot,u64 *lowSumPol,u64* sumPolY);
int testDS640(u64 DS640, u64* X, u64 Y0, u64* sumPolTest, u64* lowSumPol);
void solve(u64* DS640, u64* Y0, char* goodY, int* rot, u64* tabTmp, u64* sumPolY, u64* sumPolTest);
bool solve_isgood(const char* goodY, const int* rot, const u64* tabTmp, const u64* sumPolY, const u64* sumPolTest);
int testValid(FILE* f, int n);
//void pcgone(pcg128_t *S, u64* X, pcg128_t S0, int n);
......
......@@ -37,10 +37,10 @@ int main()
task.rot[i] = (task.rot[i] + 1) %k;
}
if (solve_isgood(task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest)) {
if (solve_isgood(&task)) {
u64 DS640;
u64 Y0;
solve(&DS640, &Y0, task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest);
solve(&task, &DS640, &Y0);
printf("candidat DS64 trouvé !!\n");
printf("%llu\n", DS640);
printf("temps pour trouver la solution = %f\n", wtime() - t1 );
......
......@@ -107,14 +107,14 @@ int testFonctions()
// printf("ok 6 - getGoodY\n");
// }
if (!solve_isgood(task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest)) {
if (!solve_isgood(&task)) {
printf("not ok 6 - erreur sur solve_isgood\n");
} else {
printf("ok 6 - solve_isgood\n");
}
u64 DS640, Y0;
solve(&DS640, &Y0, task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest);
solve(&task, &DS640, &Y0);
printf("ok 7 - solve");
return 1;
......
......@@ -29,14 +29,13 @@ int testValid (FILE* f, int n)
for(int i = 0; i < nbiter; i++)
task.rot[i] = (int) (vraiS[i] >> (2 * k - known_up));
/**** Polynômes en WC et W0 utilisés dans la résolution ****/
int a = solve_isgood(task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest);
/* check */
int a = solve_isgood(&task);
cpt += a;
if (a) {
u64 DS640;
u64 Y0;
solve(&DS640, &Y0, task.goodY, task.rot, task.tabTmp, task.sumPolY, task.sumPolTest);
solve(&task, &DS640, &Y0);
}
/* reset goodY */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment