File: test_I_sqrtp.cc

package info (click to toggle)
cln 1.3.4-4
  • links: PTS
  • area: main
  • in suites: buster
  • size: 10,724 kB
  • sloc: cpp: 80,930; sh: 11,982; ansic: 3,278; makefile: 1,313
file content (33 lines) | stat: -rw-r--r-- 829 bytes parent folder | download | duplicates (8)
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
#include "test_I.h"
#define floor(a,b)  ((a) / (b))

int test_I_sqrtp (int iterations)
{
	int error = 0;
	int i;
	// Check against isqrt.
	for (i = iterations; i > 0; i--) {
		cl_I a = testrandom_I();
		if (a >= 0) {
			cl_I w;
			bool squarep = sqrtp(a,&w);
			cl_I correct_w;
			bool correct_squarep = isqrt(a,&correct_w);
			ASSERT1(squarep == correct_squarep, a);
			if (squarep)
				ASSERT1(w == correct_w, a);
		}
	}
	// Check certain special cases.
	for (i = iterations; i > 0; i--) {
		cl_I a = abs(testrandom_I());
		cl_I w;
		// Check a^2 is a square.
		ASSERT1(sqrtp(a*a,&w) && w == a, a);
		// Check a^2+1 is not a square, except when a=0.
		if (a > 0) ASSERT1(!isqrt(a*a+1,&w) && w == a, a);
		// Check a^2+2*a is not a square, except when a=0.
		ASSERT1(isqrt(a*(a+2),&w)==(a==0) && w == a, a);
	}
	return error;
}