say 37.znorder(1000) #=> 100say 54.znorder(100001) #=> 9090
User-defined:
func mo_prime(a, p, e) { var m =p**e var t = (p-1)*(p**(e-1)) var qs = [1]forp,e in (t.factor_exp) { qs.map! {|q|0..e -> map {|j| q *p**j }... } } qs.sort.first_by {|q|powmod(a, q, m)==1 }}func mo(a, m) {gcd(a, m)==1|| die "#{a} and #{m} are not relatively prime"Math.lcm(1, m.factor_exp.map {|r|mo_prime(a, r...) }...)}say mo(37,1000)say mo(54,100001)with (10**20-1) {|b| say mo(2, b) say mo(17, b)}