Skip to content

Commit 2da09ba

Browse files
committed
Edge case in is_square
1 parent 2a57b15 commit 2da09ba

3 files changed

Lines changed: 8 additions & 1 deletion

File tree

‎code/tricks/is_square.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ long long M;
22
void init_is_square() {
33
rep(i,0,64) M |= 1ULL << (63-(i*i)%64); }
44
inline bool is_square(ll x) {
5+
if (x == 0) return true; // XXX
56
if ((M << x) >= 0) return false;
67
int c = __builtin_ctz(x);
78
if (c & 1) return false;

‎code/tricks/is_square.test.cpp‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
void test() {
22
init_is_square();
33

4+
assert_true(is_square(0));
5+
assert_true(is_square(1));
6+
assert_false(is_square(2));
7+
assert_false(is_square(3));
8+
assert_true(is_square(4));
9+
410
rep(i,0,100000) {
511
int n = rand() % 100000000;
612
int st = sqrt(n);
713
while (st*st > n) st--;
814
while (st*st < n) st++;
9-
assert_equal(st*st == n, is_square(n));
15+
assert_equal(st*st == n, is_square(n), true);
1016
}
1117
}
1218
// vim: cc=60 ts=2 sts=2 sw=2:

‎comprog.pdf‎

44 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)