@@ -618,12 +618,53 @@ def test_jacobi_symbol(self):
618
618
619
619
js = self .Integer .jacobi_symbol
620
620
621
+ # Jacobi symbol is always 1 for k==1 or n==1
622
+ for k in range (1 , 30 ):
623
+ self .assertEqual (js (k , 1 ), 1 )
624
+ for n in range (1 , 30 , 2 ):
625
+ self .assertEqual (js (1 , n ), 1 )
626
+
627
+ # Fail if n is not positive odd
628
+ self .assertRaises (ValueError , js , 6 , - 2 )
629
+ self .assertRaises (ValueError , js , 6 , - 1 )
630
+ self .assertRaises (ValueError , js , 6 , 0 )
631
+ self .assertRaises (ValueError , js , 0 , 0 )
632
+ self .assertRaises (ValueError , js , 6 , 2 )
633
+ self .assertRaises (ValueError , js , 6 , 4 )
634
+ self .assertRaises (ValueError , js , 6 , 6 )
635
+ self .assertRaises (ValueError , js , 6 , 8 )
636
+
621
637
for tv in data :
622
638
self .assertEqual (js (tv [0 ], tv [1 ]), tv [2 ])
623
639
self .assertEqual (js (self .Integer (tv [0 ]), tv [1 ]), tv [2 ])
624
640
self .assertEqual (js (tv [0 ], self .Integer (tv [1 ])), tv [2 ])
625
641
626
- self .assertRaises (ValueError , js , 6 , 8 )
642
+ def test_jacobi_symbol_wikipedia (self ):
643
+
644
+ # Test vectors from https://en.wikipedia.org/wiki/Jacobi_symbol
645
+ tv = [
646
+ (3 , [(1 , 1 ), (2 , - 1 ), (3 , 0 ), (4 , 1 ), (5 , - 1 ), (6 , 0 ), (7 , 1 ), (8 , - 1 ), (9 , 0 ), (10 , 1 ), (11 , - 1 ), (12 , 0 ), (13 , 1 ), (14 , - 1 ), (15 , 0 ), (16 , 1 ), (17 , - 1 ), (18 , 0 ), (19 , 1 ), (20 , - 1 ), (21 , 0 ), (22 , 1 ), (23 , - 1 ), (24 , 0 ), (25 , 1 ), (26 , - 1 ), (27 , 0 ), (28 , 1 ), (29 , - 1 ), (30 , 0 )]),
647
+ (5 , [(1 , 1 ), (2 , - 1 ), (3 , - 1 ), (4 , 1 ), (5 , 0 ), (6 , 1 ), (7 , - 1 ), (8 , - 1 ), (9 , 1 ), (10 , 0 ), (11 , 1 ), (12 , - 1 ), (13 , - 1 ), (14 , 1 ), (15 , 0 ), (16 , 1 ), (17 , - 1 ), (18 , - 1 ), (19 , 1 ), (20 , 0 ), (21 , 1 ), (22 , - 1 ), (23 , - 1 ), (24 , 1 ), (25 , 0 ), (26 , 1 ), (27 , - 1 ), (28 , - 1 ), (29 , 1 ), (30 , 0 )]),
648
+ (7 , [(1 , 1 ), (2 , 1 ), (3 , - 1 ), (4 , 1 ), (5 , - 1 ), (6 , - 1 ), (7 , 0 ), (8 , 1 ), (9 , 1 ), (10 , - 1 ), (11 , 1 ), (12 , - 1 ), (13 , - 1 ), (14 , 0 ), (15 , 1 ), (16 , 1 ), (17 , - 1 ), (18 , 1 ), (19 , - 1 ), (20 , - 1 ), (21 , 0 ), (22 , 1 ), (23 , 1 ), (24 , - 1 ), (25 , 1 ), (26 , - 1 ), (27 , - 1 ), (28 , 0 ), (29 , 1 ), (30 , 1 )]),
649
+ (9 , [(1 , 1 ), (2 , 1 ), (3 , 0 ), (4 , 1 ), (5 , 1 ), (6 , 0 ), (7 , 1 ), (8 , 1 ), (9 , 0 ), (10 , 1 ), (11 , 1 ), (12 , 0 ), (13 , 1 ), (14 , 1 ), (15 , 0 ), (16 , 1 ), (17 , 1 ), (18 , 0 ), (19 , 1 ), (20 , 1 ), (21 , 0 ), (22 , 1 ), (23 , 1 ), (24 , 0 ), (25 , 1 ), (26 , 1 ), (27 , 0 ), (28 , 1 ), (29 , 1 ), (30 , 0 )]),
650
+ (11 , [(1 , 1 ), (2 , - 1 ), (3 , 1 ), (4 , 1 ), (5 , 1 ), (6 , - 1 ), (7 , - 1 ), (8 , - 1 ), (9 , 1 ), (10 , - 1 ), (11 , 0 ), (12 , 1 ), (13 , - 1 ), (14 , 1 ), (15 , 1 ), (16 , 1 ), (17 , - 1 ), (18 , - 1 ), (19 , - 1 ), (20 , 1 ), (21 , - 1 ), (22 , 0 ), (23 , 1 ), (24 , - 1 ), (25 , 1 ), (26 , 1 ), (27 , 1 ), (28 , - 1 ), (29 , - 1 ), (30 , - 1 )]),
651
+ (13 , [(1 , 1 ), (2 , - 1 ), (3 , 1 ), (4 , 1 ), (5 , - 1 ), (6 , - 1 ), (7 , - 1 ), (8 , - 1 ), (9 , 1 ), (10 , 1 ), (11 , - 1 ), (12 , 1 ), (13 , 0 ), (14 , 1 ), (15 , - 1 ), (16 , 1 ), (17 , 1 ), (18 , - 1 ), (19 , - 1 ), (20 , - 1 ), (21 , - 1 ), (22 , 1 ), (23 , 1 ), (24 , - 1 ), (25 , 1 ), (26 , 0 ), (27 , 1 ), (28 , - 1 ), (29 , 1 ), (30 , 1 )]),
652
+ (15 , [(1 , 1 ), (2 , 1 ), (3 , 0 ), (4 , 1 ), (5 , 0 ), (6 , 0 ), (7 , - 1 ), (8 , 1 ), (9 , 0 ), (10 , 0 ), (11 , - 1 ), (12 , 0 ), (13 , - 1 ), (14 , - 1 ), (15 , 0 ), (16 , 1 ), (17 , 1 ), (18 , 0 ), (19 , 1 ), (20 , 0 ), (21 , 0 ), (22 , - 1 ), (23 , 1 ), (24 , 0 ), (25 , 0 ), (26 , - 1 ), (27 , 0 ), (28 , - 1 ), (29 , - 1 ), (30 , 0 )]),
653
+ (17 , [(1 , 1 ), (2 , 1 ), (3 , - 1 ), (4 , 1 ), (5 , - 1 ), (6 , - 1 ), (7 , - 1 ), (8 , 1 ), (9 , 1 ), (10 , - 1 ), (11 , - 1 ), (12 , - 1 ), (13 , 1 ), (14 , - 1 ), (15 , 1 ), (16 , 1 ), (17 , 0 ), (18 , 1 ), (19 , 1 ), (20 , - 1 ), (21 , 1 ), (22 , - 1 ), (23 , - 1 ), (24 , - 1 ), (25 , 1 ), (26 , 1 ), (27 , - 1 ), (28 , - 1 ), (29 , - 1 ), (30 , 1 )]),
654
+ (19 , [(1 , 1 ), (2 , - 1 ), (3 , - 1 ), (4 , 1 ), (5 , 1 ), (6 , 1 ), (7 , 1 ), (8 , - 1 ), (9 , 1 ), (10 , - 1 ), (11 , 1 ), (12 , - 1 ), (13 , - 1 ), (14 , - 1 ), (15 , - 1 ), (16 , 1 ), (17 , 1 ), (18 , - 1 ), (19 , 0 ), (20 , 1 ), (21 , - 1 ), (22 , - 1 ), (23 , 1 ), (24 , 1 ), (25 , 1 ), (26 , 1 ), (27 , - 1 ), (28 , 1 ), (29 , - 1 ), (30 , 1 )]),
655
+ (21 , [(1 , 1 ), (2 , - 1 ), (3 , 0 ), (4 , 1 ), (5 , 1 ), (6 , 0 ), (7 , 0 ), (8 , - 1 ), (9 , 0 ), (10 , - 1 ), (11 , - 1 ), (12 , 0 ), (13 , - 1 ), (14 , 0 ), (15 , 0 ), (16 , 1 ), (17 , 1 ), (18 , 0 ), (19 , - 1 ), (20 , 1 ), (21 , 0 ), (22 , 1 ), (23 , - 1 ), (24 , 0 ), (25 , 1 ), (26 , 1 ), (27 , 0 ), (28 , 0 ), (29 , - 1 ), (30 , 0 )]),
656
+ (23 , [(1 , 1 ), (2 , 1 ), (3 , 1 ), (4 , 1 ), (5 , - 1 ), (6 , 1 ), (7 , - 1 ), (8 , 1 ), (9 , 1 ), (10 , - 1 ), (11 , - 1 ), (12 , 1 ), (13 , 1 ), (14 , - 1 ), (15 , - 1 ), (16 , 1 ), (17 , - 1 ), (18 , 1 ), (19 , - 1 ), (20 , - 1 ), (21 , - 1 ), (22 , - 1 ), (23 , 0 ), (24 , 1 ), (25 , 1 ), (26 , 1 ), (27 , 1 ), (28 , - 1 ), (29 , 1 ), (30 , - 1 )]),
657
+ (25 , [(1 , 1 ), (2 , 1 ), (3 , 1 ), (4 , 1 ), (5 , 0 ), (6 , 1 ), (7 , 1 ), (8 , 1 ), (9 , 1 ), (10 , 0 ), (11 , 1 ), (12 , 1 ), (13 , 1 ), (14 , 1 ), (15 , 0 ), (16 , 1 ), (17 , 1 ), (18 , 1 ), (19 , 1 ), (20 , 0 ), (21 , 1 ), (22 , 1 ), (23 , 1 ), (24 , 1 ), (25 , 0 ), (26 , 1 ), (27 , 1 ), (28 , 1 ), (29 , 1 ), (30 , 0 )]),
658
+ (27 , [(1 , 1 ), (2 , - 1 ), (3 , 0 ), (4 , 1 ), (5 , - 1 ), (6 , 0 ), (7 , 1 ), (8 , - 1 ), (9 , 0 ), (10 , 1 ), (11 , - 1 ), (12 , 0 ), (13 , 1 ), (14 , - 1 ), (15 , 0 ), (16 , 1 ), (17 , - 1 ), (18 , 0 ), (19 , 1 ), (20 , - 1 ), (21 , 0 ), (22 , 1 ), (23 , - 1 ), (24 , 0 ), (25 , 1 ), (26 , - 1 ), (27 , 0 ), (28 , 1 ), (29 , - 1 ), (30 , 0 )]),
659
+ (29 , [(1 , 1 ), (2 , - 1 ), (3 , - 1 ), (4 , 1 ), (5 , 1 ), (6 , 1 ), (7 , 1 ), (8 , - 1 ), (9 , 1 ), (10 , - 1 ), (11 , - 1 ), (12 , - 1 ), (13 , 1 ), (14 , - 1 ), (15 , - 1 ), (16 , 1 ), (17 , - 1 ), (18 , - 1 ), (19 , - 1 ), (20 , 1 ), (21 , - 1 ), (22 , 1 ), (23 , 1 ), (24 , 1 ), (25 , 1 ), (26 , - 1 ), (27 , - 1 ), (28 , 1 ), (29 , 0 ), (30 , 1 )]),
660
+ ]
661
+
662
+ js = self .Integer .jacobi_symbol
663
+
664
+ for n , kj in tv :
665
+ for k , j in kj :
666
+ self .assertEqual (js (k , n ), j )
667
+
627
668
628
669
class TestIntegerInt (TestIntegerBase ):
629
670
0 commit comments