@@ -4,11 +4,12 @@ module Primes
4
4
5
5
using Base. Iterators: repeated
6
6
7
+ import Base: iterate, eltype, IteratorSize, IteratorEltype
7
8
using Base: BitSigned
8
9
using Base. Checked: checked_neg
9
10
10
11
export isprime, primes, primesmask, factor, ismersenneprime, isrieselprime,
11
- nextprime, prevprime, prime, prodfactors, radical, totient
12
+ nextprime, nextprimes, prevprime, prevprimes , prime, prodfactors, radical, totient
12
13
13
14
include (" factorization.jl" )
14
15
@@ -528,6 +529,11 @@ function totient(n::Integer)
528
529
totient (factor (abs (n)))
529
530
end
530
531
532
+ # add: checked add (when makes sense), result of same type as first argument
533
+
534
+ add (n:: BigInt , x:: Int ) = n + x
535
+ add (n:: Integer , x:: Int ) = Base. checked_add (n, oftype (n, x))
536
+
531
537
# add_! : "may" mutate the Integer argument (only for BigInt currently)
532
538
533
539
# modify a BigInt in-place
@@ -541,7 +547,7 @@ function add_!(n::BigInt, x::Int)
541
547
end
542
548
543
549
# checked addition, without mutation
544
- add_! (n:: Integer , x:: Int ) = Base . checked_add (n, oftype (n, x) )
550
+ add_! (n:: Integer , x:: Int ) = add (n, x )
545
551
546
552
"""
547
553
nextprime(n::Integer, i::Integer=1; interval::Integer=1)
@@ -691,4 +697,117 @@ julia> prime(3)
691
697
prime (:: Type{T} , i:: Integer ) where {T<: Integer } = i < 0 ? throw (DomainError (i)) : nextprime (T (2 ), i)
692
698
prime (i:: Integer ) = prime (Int, i)
693
699
700
+
701
+ struct NextPrimes{T<: Integer }
702
+ start:: T
703
+ end
704
+
705
+ function iterate (np:: NextPrimes , state= np. start)
706
+ p = nextprime (state)
707
+ (p, add (p, 1 ))
708
+ end
709
+
710
+ IteratorSize (:: Type{<:NextPrimes} ) = Base. IsInfinite ()
711
+ IteratorEltype (:: Type{<:NextPrimes} ) = Base. HasEltype ()
712
+
713
+ eltype (:: Type{NextPrimes{T}} ) where {T} = T
714
+
715
+ """
716
+ nextprimes(start::Integer)
717
+
718
+ Return an iterator over all primes greater than or equal to `start`,
719
+ in ascending order.
720
+ """
721
+ nextprimes (start:: Integer ) = NextPrimes (start)
722
+
723
+ """
724
+ nextprimes(T::Type=Int)
725
+
726
+ Return an iterator over all primes, with type `T`.
727
+ Equivalent to `nextprimes(T(1))`.
728
+ """
729
+ nextprimes (:: Type{T} = Int) where {T<: Integer } = nextprimes (one (T))
730
+
731
+ """
732
+ nextprimes(start::Integer, n::Integer)
733
+
734
+ Return an array of the first `n` primes greater than or equal to `start`.
735
+
736
+ # Example
737
+
738
+ ```
739
+ julia> nextprimes(10, 3)
740
+ 3-element Array{Int64,1}:
741
+ 11
742
+ 13
743
+ 17
744
+ ```
745
+ """
746
+ nextprimes (start:: T , n:: Integer ) where {T<: Integer } =
747
+ collect (T, Iterators. take (nextprimes (start), n))
748
+
749
+ struct PrevPrimes{T<: Integer }
750
+ start:: T
751
+ end
752
+
753
+ function iterate (np:: PrevPrimes , state= np. start)
754
+ if isone (state)
755
+ nothing
756
+ else
757
+ p = prevprime (state)
758
+ (p, p- one (p))
759
+ end
760
+ end
761
+
762
+ IteratorSize (:: Type{<:PrevPrimes} ) = Base. SizeUnknown ()
763
+ IteratorEltype (:: Type{<:PrevPrimes} ) = Base. HasEltype ()
764
+
765
+ eltype (:: Type{PrevPrimes{T}} ) where {T} = T
766
+
767
+ """
768
+ prevprimes(start::Integer)
769
+
770
+ Return an iterator over all primes less than or equal to `start`,
771
+ in descending order.
772
+
773
+ # Example
774
+
775
+ ```
776
+ julia> collect(prevprimes(10))
777
+ 4-element Array{Int64,1}:
778
+ 7
779
+ 5
780
+ 3
781
+ 2
782
+ ```
783
+ """
784
+ prevprimes (start:: Integer ) = PrevPrimes (max (one (start), start))
785
+
786
+ """
787
+ prevprimes(start::Integer, n::Integer)
788
+
789
+ Return an array of the first `n` primes less than or equal to `start`,
790
+ in descending order. When there are less than `n` primes less than or
791
+ equal to `start`, those primes are returned without an error.
792
+
793
+ # Example
794
+
795
+ ```
796
+ julia> prevprimes(10, 3)
797
+ 3-element Array{Int64,1}:
798
+ 7
799
+ 5
800
+ 3
801
+
802
+ julia> prevprimes(10, 10)
803
+ 3-element Array{Int64,1}:
804
+ 7
805
+ 5
806
+ 3
807
+ 2
808
+ ```
809
+ """
810
+ prevprimes (start:: T , n:: Integer ) where {T<: Integer } =
811
+ collect (T, Iterators. take (prevprimes (start), n))
812
+
694
813
end # module
0 commit comments