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