@@ -560,39 +560,59 @@ def has_order(self, n):
560
560
sage: P._order
561
561
7
562
562
563
+ It also works with a :class:`~sage.structure.factorization.Factorization` object::
564
+
565
+ sage: E = EllipticCurve(GF(419), [1,0])
566
+ sage: P = E(-33, 8)
567
+ sage: P.has_order(factor(21))
568
+ True
569
+ sage: P._order
570
+ 21
571
+
563
572
This method can be much faster than computing the order and comparing::
564
573
574
+ sage: # not tested -- timings are different each time
565
575
sage: p = 4 * prod(primes(3,377)) * 587 - 1
566
576
sage: E = EllipticCurve(GF(p), [1,0])
567
- sage: %timeit P = E.random_point(); P.set_order(multiple=p+1) # not tested
577
+ sage: %timeit P = E.random_point(); P.set_order(multiple=p+1)
568
578
72.4 ms ± 773 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
569
- sage: %timeit P = E.random_point(); P.has_order(p+1) # not tested
579
+ sage: %timeit P = E.random_point(); P.has_order(p+1)
570
580
32.8 ms ± 3.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
571
581
sage: fac = factor(p+1)
572
- sage: %timeit P = E.random_point(); P.has_order(fac) # not tested
582
+ sage: %timeit P = E.random_point(); P.has_order(fac)
573
583
30.6 ms ± 3.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
574
584
575
- The order is cached once it has been confirmed once::
585
+ The order is cached once it has been confirmed once, and the cache is
586
+ shared with :meth:`order`::
576
587
588
+ sage: # not tested -- timings are different each time
577
589
sage: P, = E.gens()
578
590
sage: delattr(P, '_order')
579
- sage: %time P.has_order(p+1) # not tested
580
- CPU times: user 62.1 ms, sys: 6.27 ms , total: 68.3 ms
581
- Wall time: 68 .8 ms
591
+ sage: %time P.has_order(p+1)
592
+ CPU times: user 83.6 ms, sys: 30 µs , total: 83.6 ms
593
+ Wall time: 83 .8 ms
582
594
True
583
- sage: %time P.has_order(p+1) # not tested
584
- CPU times: user 5 µs, sys: 0 ns , total: 5 µs
585
- Wall time: 5.48 µs
595
+ sage: %time P.has_order(p+1)
596
+ CPU times: user 31 µs, sys: 2 µs , total: 33 µs
597
+ Wall time: 37.9 µs
586
598
True
599
+ sage: %time P.order()
600
+ CPU times: user 11 µs, sys: 0 ns, total: 11 µs
601
+ Wall time: 16 µs
602
+ 5326738796327623094747867617954605554069371494832722337612446642054009560026576537626892113026381253624626941643949444792662881241621373288942880288065660
587
603
sage: delattr(P, '_order')
588
- sage: %time P.has_order(fac) # not tested
589
- CPU times: user 69.7 ms, sys: 14 µs, total: 69.8 ms
590
- Wall time: 70.3 ms
604
+ sage: %time P.has_order(fac)
605
+ CPU times: user 68.6 ms, sys: 17 µs, total: 68.7 ms
606
+ Wall time: 68.7 ms
591
607
True
592
- sage: %time P.has_order(fac) # not tested
593
- CPU times: user 15 µs, sys: 0 ns, total: 15 µs
594
- Wall time: 17.4 µs
608
+ sage: %time P.has_order(fac)
609
+ CPU times: user 92 µs, sys: 0 ns, total: 92 µs
610
+ Wall time: 97.5 µs
595
611
True
612
+ sage: %time P.order()
613
+ CPU times: user 10 µs, sys: 1e+03 ns, total: 11 µs
614
+ Wall time: 14.5 µs
615
+ 5326738796327623094747867617954605554069371494832722337612446642054009560026576537626892113026381253624626941643949444792662881241621373288942880288065660
596
616
"""
597
617
if hasattr (self , '_order' ): # already known
598
618
if not isinstance (n , Integer ):
0 commit comments