123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #!/usr/bin/ruby
- # Sum and count of the k-th power divisors of n.
- # See also:
- # https://oeis.org/A035316
- # https://oeis.org/A113061
- # https://oeis.org/A046951
- func power_sigma0(n,k) {
- n.factor_prod {|_,e|
- floor(e/k) + 1
- }
- }
- func power_sigma(n, k, j=1) {
- return 0 if (n == 0)
- return power_sigma0(n,k) if (j == 0)
- n.factor_prod {|p,e|
- (p**(j*k*(1+floor(e/k))) - 1) / (p**(j*k) - 1)
- }
- }
- for n in (1..20) {
- say "sum of square divisors of #{n} is #{power_sigma(n, 2)}"
- assert_eq(power_sigma(n, 2), 2.power_divisors(n).sum)
- assert_eq(power_sigma(n, 3), 3.power_divisors(n).sum)
- assert_eq(power_sigma(n, 4), 4.power_divisors(n).sum)
- assert_eq(power_sigma(n, 2, 2), 2.power_divisors(n).sum { _**2 })
- assert_eq(power_sigma(n, 3, 2), 3.power_divisors(n).sum { _**2 })
- assert_eq(power_sigma(n, 4, 2), 4.power_divisors(n).sum { _**2 })
- assert_eq(power_sigma(n, 2, 3), 2.power_divisors(n).sum { _**3 })
- assert_eq(power_sigma(n, 3, 3), 3.power_divisors(n).sum { _**3 })
- assert_eq(power_sigma(n, 4, 3), 4.power_divisors(n).sum { _**3 })
- }
- __END__
- sum of square divisors of 1 is 1
- sum of square divisors of 2 is 1
- sum of square divisors of 3 is 1
- sum of square divisors of 4 is 5
- sum of square divisors of 5 is 1
- sum of square divisors of 6 is 1
- sum of square divisors of 7 is 1
- sum of square divisors of 8 is 5
- sum of square divisors of 9 is 10
- sum of square divisors of 10 is 1
- sum of square divisors of 11 is 1
- sum of square divisors of 12 is 5
- sum of square divisors of 13 is 1
- sum of square divisors of 14 is 1
- sum of square divisors of 15 is 1
- sum of square divisors of 16 is 21
- sum of square divisors of 17 is 1
- sum of square divisors of 18 is 10
- sum of square divisors of 19 is 1
- sum of square divisors of 20 is 5
|