Hello Gerson, here is my 50g version in HPGCC2. If any want the binary let me know and I'll post it. (When I have time I may finish my 41 version.)
#include <hpgcc49.h>
#include <tommath.h>
int main(int argc, char **argv) {
mp_int D, temp1, temp2, P2, P3, Q2, Q3, a1, a2, a3, p1, p2, p3, q1, q2, q3;
int e, d, k = 0;
char buf[10000];
sys_slowOff();
mp_init(&D); mp_init(&temp1); mp_init(&temp2);
mp_init(&P2); mp_init(&P3); mp_init(&Q2); mp_init(&Q3);
mp_init(&a1); mp_init(&a2); mp_init(&a3);
mp_init(&p1); mp_init(&p2); mp_init(&p3);
mp_init(&q1); mp_init(&q2); mp_init(&q3);
e = sat_pop_real(); if(e != 0) e = 1;
d = sat_pop_real();
mp_set_int(&D,d);
mp_sqrt(&D,&a1); // a1 = sqrt(D);
mp_copy(&a1,&p1); // p1 = a1;
mp_set_int(&q1,1); // q1 = 1;
mp_copy(&a1,&P2); // P2 = a1;
mp_sqr(&a1,&temp1); // Q2 = D - a1*a1;
mp_sub(&D,&temp1,&Q2);
if(mp_iszero(&Q2)) {
sprintf(buf,"No Solution for %d!\n",d);
sat_stack_push_string(buf);
sat_push_real(1);
return(0);
}
mp_add(&a1,&P2,&temp1); //a2 = (a1+P2)/Q2;
mp_div(&temp1,&Q2,&a2,&temp2);
mp_mul(&a1,&a2,&temp1); //p2 = a1*a2 + 1;
mp_set_int(&temp2,1);
mp_add(&temp1,&temp2,&p2);
mp_copy(&a2,&q2); //q2 = a2;
if(mp_cmp(&Q2,&temp2) == 0) {
mp_toradix(&D, buf, 10);
printf("%15s ",buf);
if(!e) {
mp_toradix(&p1, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
mp_toradix(&q1, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
sat_push_real(0);
}
else {
mp_toradix(&p2, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
mp_toradix(&q2, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
sat_push_real(0);
}
return(0);
}
while(1) {
k++;
mp_mul(&a2,&Q2,&temp1); //P3 = a2*Q2 - P2;
mp_sub(&temp1,&P2,&P3);
mp_sqr(&P3,&temp1); //Q3 = (D-P3*P3)/Q2;
mp_sub(&D,&temp1,&temp2);
mp_div(&temp2,&Q2,&Q3,&temp1);
mp_set_int(&temp2,1);
if(mp_cmp(&Q3,&temp2) == 0) {
if(e && k % 2 == 1)
break;
if(!e)
if(k % 2 == 0)
break;
else {
sprintf(buf,"No Solution for %d!\n",d);
sat_stack_push_string(buf);
sat_push_real(1);
return(0);
}
}
mp_add(&a1,&P3,&temp1); //a3 = (a1+P3)/Q3;
mp_div(&temp1,&Q3,&a3,&temp2);
mp_mul(&a3,&p2,&temp1); //p3 = a3*p2 + p1;
mp_add(&temp1,&p1,&p3);
mp_mul(&a3,&q2,&temp1); //q3 = a3*q2 + q1;
mp_add(&temp1,&q1,&q3);
mp_copy(&p2,&p1); //p1 = p2;
mp_copy(&p3,&p2); //p2 = p3;
mp_copy(&q2,&q1); //q1 = q2;
mp_copy(&q3,&q2); //q2 = q3;
mp_copy(&P3,&P2); //P2 = P3;
mp_copy(&Q3,&Q2); //Q2 = Q3;
mp_copy(&a3,&a2); //a2 = a3;
}
mp_toradix(&p2, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
mp_toradix(&q2, buf, 10);
printf("%15s ",buf);
sat_stack_push_string(buf);
sat_push_real(0);
return(0);
}