Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
2
Task/Arithmetic-derivative/00-META.yaml
Normal file
2
Task/Arithmetic-derivative/00-META.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Arithmetic_derivative
|
||||
36
Task/Arithmetic-derivative/00-TASK.txt
Normal file
36
Task/Arithmetic-derivative/00-TASK.txt
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
The '''arithmetic derivative''' of an integer (more specifically, the
|
||||
'''Lagarias arithmetic derivative''') is a function defined for integers, based on prime
|
||||
factorization, by analogy with the product rule for the derivative of a function that is
|
||||
used in mathematical analysis. Accordingly, for natural numbers n, the arithmetic
|
||||
derivative D(n) is defined as follows:
|
||||
|
||||
;*D(0) = D(1) = 0.
|
||||
;*D(p) = 1 for any prime p.
|
||||
;*D(mn) = D(m)n + mD(n) for any m,n ∈ N. (Leibniz rule for derivatives).
|
||||
|
||||
Additionally, for negative integers the arithmetic derivative may be defined as -D(-n) (n < 0).
|
||||
|
||||
; Examples
|
||||
|
||||
D(2) = 1 and D(3) = 1 (both are prime) so if mn = 2 * 3, D(6) = (1)(3) + (1)(2) = 5.
|
||||
|
||||
D(9) = D(3)(3) + D(3)(3) = 6
|
||||
|
||||
D(27) = D(3)*9 + D(9)*3 = 9 + 18 = 27
|
||||
|
||||
D(30) = D(5)(6) + D(6)(5) = 6 + 5 * 5 = 31.
|
||||
|
||||
; Task
|
||||
|
||||
Find and show the arithmetic derivatives for -99 through 100.
|
||||
|
||||
; Stretch task
|
||||
|
||||
Find (the arithmetic derivative of 10^m) then divided by 7, where m is from 1 to 20.
|
||||
|
||||
; See also
|
||||
|
||||
;* [[oeis:A003415|OEIS:A003415 - a(n) = n' = arithmetic derivative of n.]]
|
||||
;*[[wp:Arithmetic_derivative|Wikipedia: Arithmetic Derivative]]
|
||||
|
||||
|
||||
51
Task/Arithmetic-derivative/C++/arithmetic-derivative.cpp
Normal file
51
Task/Arithmetic-derivative/C++/arithmetic-derivative.cpp
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
#include <iomanip>
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
|
||||
template <typename IntegerType>
|
||||
IntegerType arithmetic_derivative(IntegerType n) {
|
||||
bool negative = n < 0;
|
||||
if (negative)
|
||||
n = -n;
|
||||
if (n < 2)
|
||||
return 0;
|
||||
IntegerType sum = 0, count = 0, m = n;
|
||||
while ((m & 1) == 0) {
|
||||
m >>= 1;
|
||||
count += n;
|
||||
}
|
||||
if (count > 0)
|
||||
sum += count / 2;
|
||||
for (IntegerType p = 3, sq = 9; sq <= m; p += 2) {
|
||||
count = 0;
|
||||
while (m % p == 0) {
|
||||
m /= p;
|
||||
count += n;
|
||||
}
|
||||
if (count > 0)
|
||||
sum += count / p;
|
||||
sq += (p + 1) << 2;
|
||||
}
|
||||
if (m > 1)
|
||||
sum += n / m;
|
||||
if (negative)
|
||||
sum = -sum;
|
||||
return sum;
|
||||
}
|
||||
|
||||
int main() {
|
||||
using boost::multiprecision::int128_t;
|
||||
|
||||
for (int n = -99, i = 0; n <= 100; ++n, ++i) {
|
||||
std::cout << std::setw(4) << arithmetic_derivative(n)
|
||||
<< ((i + 1) % 10 == 0 ? '\n' : ' ');
|
||||
}
|
||||
|
||||
int128_t p = 10;
|
||||
std::cout << '\n';
|
||||
for (int i = 0; i < 20; ++i, p *= 10) {
|
||||
std::cout << "D(10^" << std::setw(2) << i + 1
|
||||
<< ") / 7 = " << arithmetic_derivative(p) / 7 << '\n';
|
||||
}
|
||||
}
|
||||
76
Task/Arithmetic-derivative/C/arithmetic-derivative.c
Normal file
76
Task/Arithmetic-derivative/C/arithmetic-derivative.c
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef uint64_t u64;
|
||||
|
||||
void primeFactors(u64 n, u64 *factors, int *length) {
|
||||
if (n < 2) return;
|
||||
int count = 0;
|
||||
int inc[8] = {4, 2, 4, 2, 4, 6, 2, 6};
|
||||
while (!(n%2)) {
|
||||
factors[count++] = 2;
|
||||
n /= 2;
|
||||
}
|
||||
while (!(n%3)) {
|
||||
factors[count++] = 3;
|
||||
n /= 3;
|
||||
}
|
||||
while (!(n%5)) {
|
||||
factors[count++] = 5;
|
||||
n /= 5;
|
||||
}
|
||||
for (u64 k = 7, i = 0; k*k <= n; ) {
|
||||
if (!(n%k)) {
|
||||
factors[count++] = k;
|
||||
n /= k;
|
||||
} else {
|
||||
k += inc[i];
|
||||
i = (i + 1) % 8;
|
||||
}
|
||||
}
|
||||
if (n > 1) {
|
||||
factors[count++] = n;
|
||||
}
|
||||
*length = count;
|
||||
}
|
||||
|
||||
double D(double n) {
|
||||
if (n < 0) return -D(-n);
|
||||
if (n < 2) return 0;
|
||||
int i, length;
|
||||
double d;
|
||||
u64 f[80], g;
|
||||
if (n < 1e19) {
|
||||
primeFactors((u64)n, f, &length);
|
||||
} else {
|
||||
g = (u64)(n / 100);
|
||||
primeFactors(g, f, &length);
|
||||
f[length+1] = f[length] = 2;
|
||||
f[length+3] = f[length+2] = 5;
|
||||
length += 4;
|
||||
}
|
||||
if (length == 1) return 1;
|
||||
if (length == 2) return (double)(f[0] + f[1]);
|
||||
d = n / (double)f[0];
|
||||
return D(d) * (double)f[0] + d;
|
||||
}
|
||||
|
||||
int main() {
|
||||
u64 ad[200];
|
||||
int n, m;
|
||||
double pow;
|
||||
for (n = -99; n < 101; ++n) {
|
||||
ad[n+99] = (int)D((double)n);
|
||||
}
|
||||
for (n = 0; n < 200; ++n) {
|
||||
printf("%4ld ", ad[n]);
|
||||
if (!((n+1)%10)) printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
pow = 1;
|
||||
for (m = 1; m < 21; ++m) {
|
||||
pow *= 10;
|
||||
printf("D(10^%-2d) / 7 = %.0f\n", m, D(pow)/7);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
USING: combinators formatting grouping io kernel math
|
||||
math.primes.factors prettyprint ranges sequences ;
|
||||
|
||||
: n' ( m -- n )
|
||||
{
|
||||
{ [ dup neg? ] [ neg n' neg ] }
|
||||
{ [ dup 2 < ] [ drop 0 ] }
|
||||
{ [ factors dup length 1 = ] [ drop 1 ] }
|
||||
[ unclip-slice swap product 2dup n' * spin n' * + ]
|
||||
} cond ;
|
||||
|
||||
-99 100 [a..b] [ n' ] map 10 group
|
||||
[ [ "%5d" printf ] each nl ] each
|
||||
46
Task/Arithmetic-derivative/Go/arithmetic-derivative.go
Normal file
46
Task/Arithmetic-derivative/Go/arithmetic-derivative.go
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"rcu"
|
||||
)
|
||||
|
||||
func D(n float64) float64 {
|
||||
if n < 0 {
|
||||
return -D(-n)
|
||||
}
|
||||
if n < 2 {
|
||||
return 0
|
||||
}
|
||||
var f []int
|
||||
if n < 1e19 {
|
||||
f = rcu.PrimeFactors(int(n))
|
||||
} else {
|
||||
g := int(n / 100)
|
||||
f = rcu.PrimeFactors(g)
|
||||
f = append(f, []int{2, 2, 5, 5}...)
|
||||
}
|
||||
c := len(f)
|
||||
if c == 1 {
|
||||
return 1
|
||||
}
|
||||
if c == 2 {
|
||||
return float64(f[0] + f[1])
|
||||
}
|
||||
d := n / float64(f[0])
|
||||
return D(d)*float64(f[0]) + d
|
||||
}
|
||||
|
||||
func main() {
|
||||
ad := make([]int, 200)
|
||||
for n := -99; n < 101; n++ {
|
||||
ad[n+99] = int(D(float64(n)))
|
||||
}
|
||||
rcu.PrintTable(ad, 10, 4, false)
|
||||
fmt.Println()
|
||||
pow := 1.0
|
||||
for m := 1; m < 21; m++ {
|
||||
pow *= 10
|
||||
fmt.Printf("D(10^%-2d) / 7 = %.0f\n", m, D(pow)/7)
|
||||
}
|
||||
}
|
||||
32
Task/Arithmetic-derivative/Haskell/arithmetic-derivative.hs
Normal file
32
Task/Arithmetic-derivative/Haskell/arithmetic-derivative.hs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import Control.Monad (forM_)
|
||||
import Data.List (intercalate)
|
||||
import Data.List.Split (chunksOf)
|
||||
import Math.NumberTheory.Primes (factorise, unPrime)
|
||||
import Text.Printf (printf)
|
||||
|
||||
-- The arithmetic derivative of a number, which is assumed to be non-negative.
|
||||
arithderiv_ :: Integer -> Integer
|
||||
arithderiv_ 0 = 0
|
||||
arithderiv_ n = foldr step 0 $ factorise n
|
||||
where step (p, v) s = s + n `quot` unPrime p * fromIntegral v
|
||||
|
||||
-- The arithmetic derivative of any integer.
|
||||
arithderiv :: Integer -> Integer
|
||||
arithderiv n | n < 0 = negate $ arithderiv_ (negate n)
|
||||
| otherwise = arithderiv_ n
|
||||
|
||||
printTable :: [Integer] -> IO ()
|
||||
printTable = putStrLn
|
||||
. intercalate "\n"
|
||||
. map unwords
|
||||
. chunksOf 10
|
||||
. map (printf "%5d")
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
printTable [arithderiv n | n <- [-99..100]]
|
||||
putStrLn ""
|
||||
forM_ [1..20 :: Integer] $ \i ->
|
||||
let q = 7
|
||||
n = arithderiv (10^i) `quot` q
|
||||
in printf "D(10^%-2d) / %d = %d\n" i q n
|
||||
1
Task/Arithmetic-derivative/J/arithmetic-derivative-1.j
Normal file
1
Task/Arithmetic-derivative/J/arithmetic-derivative-1.j
Normal file
|
|
@ -0,0 +1 @@
|
|||
D=: {{ +/y%q:1>.|y }}"0
|
||||
21
Task/Arithmetic-derivative/J/arithmetic-derivative-2.j
Normal file
21
Task/Arithmetic-derivative/J/arithmetic-derivative-2.j
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
D _99+i.20 10
|
||||
_75 _77 _1 _272 _24 _49 _34 _96 _20 _123
|
||||
_1 _140 _32 _45 _22 _124 _1 _43 _108 _176
|
||||
_1 _71 _18 _80 _55 _39 _1 _156 _1 _59
|
||||
_26 _72 _1 _61 _18 _192 _51 _33 _1 _92
|
||||
_1 _31 _22 _92 _16 _81 _1 _56 _20 _45
|
||||
_14 _112 _1 _25 _39 _48 _1 _41 _1 _68
|
||||
_16 _21 _1 _60 _12 _19 _14 _80 _1 _31
|
||||
_1 _32 _27 _15 _10 _44 _1 _13 _10 _24
|
||||
_1 _21 _1 _32 _8 _9 _1 _16 _1 _7
|
||||
_6 _12 _1 _5 _1 _4 _1 _1 0 0
|
||||
0 1 1 4 1 5 1 12 6 7
|
||||
1 16 1 9 8 32 1 21 1 24
|
||||
10 13 1 44 10 15 27 32 1 31
|
||||
1 80 14 19 12 60 1 21 16 68
|
||||
1 41 1 48 39 25 1 112 14 45
|
||||
20 56 1 81 16 92 22 31 1 92
|
||||
1 33 51 192 18 61 1 72 26 59
|
||||
1 156 1 39 55 80 18 71 1 176
|
||||
108 43 1 124 22 45 32 140 1 123
|
||||
20 96 34 49 24 272 1 77 75 140
|
||||
2
Task/Arithmetic-derivative/J/arithmetic-derivative-3.j
Normal file
2
Task/Arithmetic-derivative/J/arithmetic-derivative-3.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
15 10 6 + 2 3 5 * D 15 10 6
|
||||
31 31 31
|
||||
5
Task/Arithmetic-derivative/J/arithmetic-derivative-4.j
Normal file
5
Task/Arithmetic-derivative/J/arithmetic-derivative-4.j
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
(D 10x^1+i.4 5)%7
|
||||
1 20 300 4000 50000
|
||||
600000 7000000 80000000 900000000 10000000000
|
||||
110000000000 1200000000000 13000000000000 140000000000000 1500000000000000
|
||||
16000000000000000 170000000000000000 1800000000000000000 19000000000000000000 200000000000000000000
|
||||
38
Task/Arithmetic-derivative/Java/arithmetic-derivative.java
Normal file
38
Task/Arithmetic-derivative/Java/arithmetic-derivative.java
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import java.math.BigInteger;
|
||||
|
||||
public final class ArithmeticDerivative {
|
||||
|
||||
public static void main(String[] aArgs) {
|
||||
System.out.println("Arithmetic derivatives for -99 to 100 inclusive:");
|
||||
for ( int n = -99, column = 0; n <= 100; n++ ) {
|
||||
System.out.print(String.format("%4d%s",
|
||||
derivative(BigInteger.valueOf(n)), ( ++column % 10 == 0 ) ? "\n" : " "));
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
final BigInteger seven = BigInteger.valueOf(7);
|
||||
for ( int power = 1; power <= 20; power++ ) {
|
||||
System.out.println(String.format("%s%2d%s%d",
|
||||
"D(10^", power, ") / 7 = ", derivative(BigInteger.TEN.pow(power)).divide(seven)));
|
||||
}
|
||||
}
|
||||
|
||||
private static BigInteger derivative(BigInteger aNumber) {
|
||||
if ( aNumber.signum() == -1 ) {
|
||||
return derivative(aNumber.negate()).negate();
|
||||
}
|
||||
if ( aNumber == BigInteger.ZERO || aNumber == BigInteger.ONE ) {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
BigInteger divisor = BigInteger.TWO;
|
||||
while ( divisor.multiply(divisor).compareTo(aNumber) <= 0 ) {
|
||||
if ( aNumber.mod(divisor).signum() == 0 ) {
|
||||
final BigInteger quotient = aNumber.divide(divisor);
|
||||
return quotient.multiply(derivative(divisor)).add(divisor.multiply(derivative(quotient)));
|
||||
}
|
||||
divisor = divisor.add(BigInteger.ONE);
|
||||
}
|
||||
return BigInteger.ONE;
|
||||
}
|
||||
|
||||
}
|
||||
34
Task/Arithmetic-derivative/Jq/arithmetic-derivative.jq
Normal file
34
Task/Arithmetic-derivative/Jq/arithmetic-derivative.jq
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
To take advantage of gojq's arbitrary-precision integer arithmetic:
|
||||
def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in);
|
||||
|
||||
# In case gojq is used:
|
||||
def _nwise($n):
|
||||
def nw: if length <= $n then . else .[0:$n] , (.[$n:] | nw) end;
|
||||
nw;
|
||||
|
||||
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
|
||||
|
||||
def D($n):
|
||||
if $n < 0 then -D(- $n)
|
||||
elif $n < 2 then 0
|
||||
else [$n | factors] as $f
|
||||
| ($f|length) as $c
|
||||
| if $c <= 1 then 1
|
||||
elif $c == 2 then $f[0] + $f[1]
|
||||
else ($n / $f[0]) as $d
|
||||
| D($d) * $f[0] + $d
|
||||
end
|
||||
end ;
|
||||
|
||||
def task:
|
||||
def task1:
|
||||
reduce range(-99; 101) as $n ([]; .[$n+99] = D($n))
|
||||
| _nwise(10) | map(lpad(4)) | join(" ");
|
||||
|
||||
def task2:
|
||||
range(1; 21) as $i
|
||||
| "D(10^\($i)) / 7 = \( D(10|power($i))/7 )" ;
|
||||
|
||||
task1, "", task2 ;
|
||||
|
||||
task
|
||||
10
Task/Arithmetic-derivative/Julia/arithmetic-derivative.julia
Normal file
10
Task/Arithmetic-derivative/Julia/arithmetic-derivative.julia
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
using Primes
|
||||
|
||||
D(n) = n < 0 ? -D(-n) : n < 2 ? zero(n) : isprime(n) ? one(n) : typeof(n)(sum(e * n ÷ p for (p, e) in eachfactor(n)))
|
||||
|
||||
foreach(p -> print(lpad(p[2], 5), p[1] % 10 == 0 ? "\n" : ""), pairs(map(D, -99:100)))
|
||||
|
||||
println()
|
||||
for m in 1:20
|
||||
println("D for 10^", rpad(m, 3), "divided by 7 is ", D(Int128(10)^m) ÷ 7)
|
||||
end
|
||||
46
Task/Arithmetic-derivative/Nim/arithmetic-derivative.nim
Normal file
46
Task/Arithmetic-derivative/Nim/arithmetic-derivative.nim
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import std/[strformat, strutils]
|
||||
import integers
|
||||
|
||||
|
||||
func aDerivative(n: int | Integer): typeof(n) =
|
||||
## Recursively compute the arithmetic derivative.
|
||||
## The function works with normal integers or big integers.
|
||||
## Using a cache to store the derivatives would improve the
|
||||
## performance, but this is not needed for these tasks.
|
||||
if n < 0: return -aDerivative(-n)
|
||||
if n == 0 or n == 1: return 0
|
||||
if n == 2: return 1
|
||||
var d = 2
|
||||
result = 1
|
||||
while d * d <= n:
|
||||
if n mod d == 0:
|
||||
let q = n div d
|
||||
result = q * aDerivative(d) + d * aDerivative(q)
|
||||
break
|
||||
inc d
|
||||
|
||||
|
||||
### Task ###
|
||||
|
||||
echo "Arithmetic derivatives for -99 through 100:"
|
||||
|
||||
# We can use an "int" variable here.
|
||||
var col = 0
|
||||
for n in -99..100:
|
||||
inc col
|
||||
stdout.write &"{aDerivative(n):>4}"
|
||||
stdout.write if col == 10: '\n' else: ' '
|
||||
if col == 10: col = 0
|
||||
|
||||
|
||||
### Stretch task ###
|
||||
|
||||
echo()
|
||||
|
||||
# To avoid overflow, we have to use an "Integer" variable.
|
||||
var n = Integer(1)
|
||||
for m in 1..20:
|
||||
n *= 10
|
||||
let a = aDerivative(n)
|
||||
let left = &"D(10^{m}) / 7"
|
||||
echo &"{left:>12} = {a div 7}"
|
||||
17
Task/Arithmetic-derivative/Perl/arithmetic-derivative.pl
Normal file
17
Task/Arithmetic-derivative/Perl/arithmetic-derivative.pl
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
use v5.36;
|
||||
use bigint;
|
||||
no warnings 'uninitialized';
|
||||
use List::Util 'max';
|
||||
use ntheory 'factor';
|
||||
|
||||
sub table ($c, @V) { my $t = $c * (my $w = 2 + length max @V); ( sprintf( ('%'.$w.'d')x@V, @V) ) =~ s/.{1,$t}\K/\n/gr }
|
||||
|
||||
sub D ($n) {
|
||||
my(%f, $s);
|
||||
$f{$_}++ for factor max 1, my $nabs = abs $n;
|
||||
map { $s += $nabs * $f{$_} / $_ } keys %f;
|
||||
$n > 0 ? $s : -$s;
|
||||
}
|
||||
|
||||
say table 10, map { D $_ } -99 .. 100;
|
||||
say join "\n", map { sprintf('D(10**%-2d) / 7 == ', $_) . D(10**$_) / 7 } 1 .. 20;
|
||||
42
Task/Arithmetic-derivative/Phix/arithmetic-derivative.phix
Normal file
42
Task/Arithmetic-derivative/Phix/arithmetic-derivative.phix
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">D</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpz</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_cmp_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">mpz_neg</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mpz_cmp_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_prime_factors</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">vslice</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)),</span>
|
||||
<span style="color: #000000;">f1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f1</span> <span style="color: #0000FF;">+</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #000000;">f1</span><span style="color: #0000FF;">:</span><span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mpz_fdiv_q_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f1</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">D</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">mpz_neg</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">200</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">99</span> <span style="color: #008080;">to</span> <span style="color: #000000;">100</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">mpz_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">D</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">100</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">:=</span><span style="color: #008000;">"%4s"</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">20</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">mpz_ui_pow_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">m</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">D</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mpz_fdiv_q_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"D(10^%d)/7 = %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
19
Task/Arithmetic-derivative/Python/arithmetic-derivative.py
Normal file
19
Task/Arithmetic-derivative/Python/arithmetic-derivative.py
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
from sympy.ntheory import factorint
|
||||
|
||||
def D(n):
|
||||
if n < 0:
|
||||
return -D(-n)
|
||||
elif n < 2:
|
||||
return 0
|
||||
else:
|
||||
fdict = factorint(n)
|
||||
if len(fdict) == 1 and 1 in fdict: # is prime
|
||||
return 1
|
||||
return sum([n * e // p for p, e in fdict.items()])
|
||||
|
||||
for n in range(-99, 101):
|
||||
print('{:5}'.format(D(n)), end='\n' if n % 10 == 0 else '')
|
||||
|
||||
print()
|
||||
for m in range(1, 21):
|
||||
print('(D for 10**{}) divided by 7 is {}'.format(m, D(10 ** m) // 7))
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
[ dup 0 < iff
|
||||
[ negate
|
||||
' negate ]
|
||||
else []
|
||||
swap 0 over
|
||||
primefactors
|
||||
witheach
|
||||
[ dip over / + ]
|
||||
nip swap do ] is d ( n --> n )
|
||||
|
||||
200 times [ i^ 99 - d echo sp ]
|
||||
cr cr
|
||||
20 times [ 10 i^ 1+ ** d 7 / echo cr ]
|
||||
14
Task/Arithmetic-derivative/Raku/arithmetic-derivative.raku
Normal file
14
Task/Arithmetic-derivative/Raku/arithmetic-derivative.raku
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
use Prime::Factor;
|
||||
|
||||
multi D (0) { 0 }
|
||||
multi D (1) { 0 }
|
||||
multi D ($n where &is-prime) { 1 }
|
||||
multi D ($n where * < 0 ) { -D -$n }
|
||||
multi D ($n) { sum $n.&prime-factors.Bag.map: { $n × .value / .key } }
|
||||
|
||||
|
||||
put (-99 .. 100).map(&D).batch(10)».fmt("%4d").join: "\n";
|
||||
|
||||
put '';
|
||||
|
||||
put join "\n", (1..20).map: { sprintf "D(10**%-2d) / 7 == %d", $_, D(10**$_) / 7 }
|
||||
21
Task/Arithmetic-derivative/Wren/arithmetic-derivative.wren
Normal file
21
Task/Arithmetic-derivative/Wren/arithmetic-derivative.wren
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import "./big" for BigInt
|
||||
import "./fmt" for Fmt
|
||||
|
||||
var D = Fn.new { |n|
|
||||
if (n < 0) return -D.call(-n)
|
||||
if (n < 2) return BigInt.zero
|
||||
var f = BigInt.primeFactors(n)
|
||||
var c = f.count
|
||||
if (c == 1) return BigInt.one
|
||||
if (c == 2) return f[0] + f[1]
|
||||
var d = n / f[0]
|
||||
return D.call(d) * f[0] + d
|
||||
}
|
||||
|
||||
var ad = List.filled(200, 0)
|
||||
for (n in -99..100) ad[n+99] = D.call(BigInt.new(n))
|
||||
Fmt.tprint("$4i", ad, 10)
|
||||
System.print()
|
||||
for (m in 1..20) {
|
||||
Fmt.print("D(10^$-2d) / 7 = $i", m, D.call(BigInt.ten.pow(m))/7)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue