| 618 | // ------------------------------------------------ |
| 619 | |
| 620 | bool Int::HasSqrt() { |
| 621 | |
| 622 | // Euler's criterion |
| 623 | Int e(&_P); |
| 624 | Int a(this); |
| 625 | e.SubOne(); |
| 626 | e.ShiftR(1); |
| 627 | a.ModExp(&e); |
| 628 | |
| 629 | return a.IsOne(); |
| 630 | |
| 631 | } |
| 632 | |
| 633 | // ------------------------------------------------ |
| 634 |