Zsigmondy numbers

func zsigmondy (a, b, c) {

    var aexp = (0..c -> map {|k| a**k })
    var bexp = (0..c -> map {|k| b**k })

    var z = []
    for n in (1 .. c) {
        divisors(aexp[n] - bexp[n]).flip.each {|d|
            1 ..^ n -> all {|k|
                aexp[k] - bexp[k] -> is_coprime(d)
            } && (z << d; break)
        }
    }
    return z
}

for name,a,b in ([
    'A064078: Zsigmondy(n,2,1)', 2,1,
    'A064079: Zsigmondy(n,3,1)', 3,1,
    'A064080: Zsigmondy(n,4,1)', 4,1,
    'A064081: Zsigmondy(n,5,1)', 5,1,
    'A064082: Zsigmondy(n,6,1)', 6,1,
    'A064083: Zsigmondy(n,7,1)', 7,1,
    'A109325: Zsigmondy(n,3,2)', 3,2,
    'A109347: Zsigmondy(n,5,3)', 5,3,
    'A109348: Zsigmondy(n,7,3)', 7,3,
    'A109349: Zsigmondy(n,7,5)', 7,5,
].slices(3)) {
    say ("\n#{name}:\n", zsigmondy(a, b, 20))
}

Output:

Last updated

Was this helpful?