1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
void __fastcall TKaratsubaThread::Execute()
{
//NameThreadForDebugging(System::String(L"KaratsubaThr")+thr_prefixe);
while (!Terminated)
{
KWaitForStart[quel_karatsuba]->WaitFor(60000);
KWaitForStart[quel_karatsuba]->ResetEvent();
if (Terminated)
break;
if (v1_digits_nb < K_MUL_LIMIT)
{
jpn2_mul_school(vr, v1, v1, vr_digits_nb, v1_digits_nb, v1_digits_nb);
}
else
{
jpNdigitsnb p = v1_digits_nb, p2 = p>>1, p3 = p-p2;
jpNdigit *vs, *vg, *vd, *vps, *vmtmp, *vm, *fin;
vs = vr + vr_digits_nb;
vg = jpn2_add(vs, v1, v1+p2, p3+1, p2, p3); // vS = a + b
vd = jpn2_square_karatsuba(vg, v1, p2+p2, p2); // vG = aa
vps = jpn2_square_karatsuba(vd, v1+p2, p3+p3, p3); // vD = bb
vmtmp = jpn2_square_karatsuba(vps, vs, p3+1+p3+1, p3+1); // vM = (a + b)(c + d)
vm = jpn2_sub(vmtmp, vps, vg, p3+1+p3+1, p3+1+p3+1, p2+p2); // vM = (a + b)(c + d) - ac
fin = jpn2_sub(vm, vmtmp, vd, p3+1+p3+1, p3+1+p3+1, p3+p3); // vM = (a + b)(c + d) - ac - bd
jpn2_karatsuba_recompose(vr, vg, vm, vd, vr_digits_nb, p2+p2, p3+1+p3+1, p3+p3, p2);
}
KResultProduced[quel_karatsuba]->SetEvent();
}
} |
Partager