Greatest prime dividing the n-th cubefree number

Version 1

Built-in as Number#nth_cubefree():

say "The first 100 terms of A370833 are:"
cubefree(100.nth_cubefree).map{.gpf}.each_slice(10, {|*a|
    a.map { '%3s' % _ }.join(' ').say
}); say ''

for n in (1..20) {
    say ("a(10^#{n}) = ", nth_cubefree(10**n).gpf)
}

Output:

The first 100 terms of A370833 are:
  1   2   3   2   5   3   7   3   5  11
  3  13   7   5  17   3  19   5   7  11
 23   5  13   7  29   5  31  11  17   7
  3  37  19  13  41   7  43  11   5  23
 47   7   5  17  13  53  11  19  29  59
  5  61  31   7  13  11  67  17  23   7
 71  73  37   5  19  11  13  79  41  83
  7  17  43  29  89   5  13  23  31  47
 19  97   7  11   5 101  17 103   7  53
107 109  11  37 113  19  23  29  13  59

a(10^1) = 11
a(10^2) = 59
a(10^3) = 109
a(10^4) = 101
a(10^5) = 1693
a(10^6) = 1202057
a(10^7) = 1202057
a(10^8) = 20743
a(10^9) = 215461
a(10^10) = 1322977
a(10^11) = 145823
a(10^12) = 400685634379
a(10^13) = 1498751
a(10^14) = 57349
a(10^15) = 74509198733
a(10^16) = 632661527978737
a(10^17) = 3018045307
a(10^18) = 89387
a(10^19) = 14563696231181
a(10^20) = 13237054323968663

Version 2

Explicit implementation:

func powerfree_count(n, k=2) {
    var sum = 0
    n.iroot(k).each_squarefree {|v|
        sum += (moebius(v) * idiv(n, v**k))
    }
    return sum
}

func nth_powerfree(n,k=2) {

    n <= 0 && return NaN
    n == 1 && return 1

    var v = int(zeta(k)*n)
    var c = powerfree_count(v, k)

    while (!v.is_powerfree(k)) {
        --v
    }

    while (c != n) {
        var j = (n <=> c)
        v += j
        c += j
        v += j while !v.is_powerfree(k)
    }

    return v
}

say {|n| nth_powerfree(n, 3).gpf }.map(1..100)

for n in (1..20) {
    say ("a(10^#{n}) = ", nth_powerfree(10**n, 3).gpf)
}

Try it online!

Last updated