using Printf import Base.GMP.MPZ: add!, sub!, mul!, fdiv_r!, gcd! # single-line comments #= multi-line comments =# # https://stackoverflow.com/a/69000702 function pollard_rho(n::BigInt)::Union{Some{BigInt}, Nothing} x, y, d = BigInt(2), BigInt(2), BigInt(1) while d == big"1" mul!(x, x); add!(x, big"1"); fdiv_r!(x, n) mul!(y, y); add!(y, big"1"); fdiv_r!(y, n) mul!(y, y); add!(y, big"1"); fdiv_r!(y, n) sub!(d, x, y); gcd!(d, abs(d), n) end if d != n return Some(d) else return nothing end end if abspath(PROGRAM_FILE) == @__FILE__ n = parse(BigInt, ARGS[1]) result = pollard_rho(n) try p = something(result) @printf "%d = %d * %d\n" n p (n÷p) catch e @printf "%d is prime\n" n end end