Codegolf — Арифметическая Производная

  • Автор темы Karlen
  • Обновлено
  • 21, Oct 2024
  • #1

Производная функции является краеугольным камнем математики, техники, физики, биологии, химии, а также большого числа других наук. Сегодня мы собираемся вычислять нечто косвенное: арифметическую производную.

Определение

Арифметическая производная

 > a(1)
0
> a(7)
1
> a(14)   # a(7)*2 + a(2)*7 = 1*2 + 1*7 = 9
9
> a(-5)   # a(-5) = -a(5) = -1
-1
> a(8)    # a(8) = a(2**3) = 3*2**2 = 12
12
> a(225)  # a(225) = a(9)*25 + a(25)*9 = 6*25 + 10*9 = 150 + 90 = 240
240
> a(299792458)  # a(299792458) = a(2)*149896229 + a(7)*42827494 + a(73)*4106746 + a(293339)*1022 = 1*149896229 + 1*42827494 + 1*4106746 + 1*1022 = 149896229 + 42827494 + 4106746 + 1022 = 196831491
196831491
 
or -230 < n < 230 здесь определено (А003415) по ряду свойств, аналогичных производной функции.

  • n ,
  • n , where a(-n) = -a(n) любое простое число, и
  • (ab)' = a'b + ab' .

Третье правило основано на правиле произведения дифференциации функций: для функций (fg)' = f'g + fg' and g(x) , f(x) . So with numbers, a(mn) = m*a(n) + n*a(m) .

Также следует отметить, что арифметическая производная может быть распространена на отрицательные числа с помощью этого простого соотношения: p , the input may be negative.

Правила

  • Напишите программу или функцию, которая по любому целому числу a(p) = 1 , returns the arithmetic derivative of a(0) = a(1) = 0 .
  • Входы будут n' , to avoid problems with integer sizes and numbers too large to factor in a reasonable amount of time. Your algorithm should still be able to theoretically calculate the arithmetic derivative of numbers outside this range.
  • Допускаются встроенные функции символьной математики, факторизации простых чисел и дифференцирования.

Примеры

a(n)

Как всегда, если проблема неясна, пожалуйста, дайте мне знать. Удачи и хорошей игры в гольф!

#код-гольф #математика #последовательность #арифметика #теория чисел

Karlen


Рег
25 Dec, 2015

Тем
84

Постов
186

Баллов
656
  • 26, Oct 2024
  • #2

МАТЛ, 12 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 n->n*vecsum([i[2]/p|i<-factor(n)~,0<p=i[1]])
 

Попробуйте онлайн!

Объяснение

Рассмотрим целое число а с |а|>1, и пусть (возможно, повторяющиеся) простые множители |а| быть ж1, ..., жн. Тогда желаемый результат а·(1/ж1 + ... + 1/жн).

==function a(n) {n<0: ~return-a(-n) } {n<2: ~return 0 } ~temp f=t(n,2) {f: ~return a(n/f)*f+n/f } ~return 1 ==function t(n,i) {n>1&&n-i: {n%i: ~return t(n,i+1) } ~return i } ~return 0 ||answer||

Питон, 59 байт

2..n.sqrt

Рекурсивная функция. При больших входных данных в типичных системах ему не хватает глубины стека, если только вы не запускаете его с чем-то вроде Бесстековый Python.

Рекурсивное определение реализуется напрямую, осуществляя подсчет для поиска кандидатов на простые множители. С 2..^n , if sub A(\n) {0>n??-A(-n)!!(n>1)*{$_??n/$_*A($_)+$_*A n/$_!!1}(first n%%*,2..^n)};say A slurp имеет простое число If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i). as a factor, we have perl -MMath::Prime::Util=:all -E"map$i+=1/$_,factor abs($j=<>);say$i*$j" .

 

Maxxkol


Рег
11 Sep, 2011

Тем
74

Постов
202

Баллов
572
  • 26, Oct 2024
  • #3

Желе, 8 7 байт

-1 байт от @Dennis

ȧ # Abs. val ǐ # All prime factors # (Implicit input) / # Divided by each factor. # (s flag) sum of stack

Использует ту же формулу, что и все остальные. Однако есть небольшая хитрость, с которой нужно справиться. ȧǐ/ .

s

Попробуйте это здесь.

 

Dodo1980


Рег
15 May, 2011

Тем
93

Постов
187

Баллов
692
  • 26, Oct 2024
  • #4

Python 2, 87 78 76 74 байта

Ä # Take the absolute value of the (implicit) input Ò # Get all its prime factors (with duplicates) ÷ # Integer divide the (implicit) input by each of these prime factors O # And take the sum (which is output implicitly)

Улучшения благодаря @Maltysen:

ÄÒ÷O

Дальнейшее улучшение на два байта:

f←{1≥a←∣⍵:0⋄1=≢k←πa:×⍵⋄c+m×∇c←⍵÷m←↑k} f 14 9 f 8 12 f 225 240 f ¯5 ¯1 f 299792458 196831491

Дальнейшее улучшение благодаря @xnor:

{1≥a←∣⍵:0⋄1=≢k←πa:×⍵⋄c+m×∇c←⍵÷m←↑k}

Объяснение

Арифметическая производная Tr[If[#>1,#2/#,0]&@@@FactorInteger@#]#& is equal to *jmauΜm)jd/1H *j input times m)j p.f. of input Μ d/1H mapped to inverse u sum of ma abs of раз сумму обратных величин простых множителей *jmauΜm)jd/1H . No exception for 1 is needed since the sum of the reciprocals of the prime factors of 1 is zero.

 

Tauralex


Рег
04 Oct, 2007

Тем
77

Постов
181

Баллов
596
  • 26, Oct 2024
  • #5

Хаскелл, 203 90 байт

Спасибо @nimi!

Я до сих пор понятия не имею, какие отступы вызывают какую интерпретацию, это самое короткое, что мне удалось до сих пор, и, как всегда, я уверен, что в него можно играть гораздо больше. Вечером попробую еще раз.

, get a single input ;w duplicate input and get prime factorization, p_f for input [-1..1], this returns [] and is dealt with at the end ` `M map the function inside `` to p_f i pop all elements of p_f[i], the prime and the exponent, to the stack @ rotate so that the exponent is at the top of the stack / divide the exponent by the prime Σ sum it all together * multiply this sum with the input l map and multiply do not affect an empty list, so we just take the length, 0 l is a no-op for a number, so the result is unchanged for all other inputs ||answer||

Дж, 30 27 19 символов

Благодаря @Деннис за отрубание 3 символов.

Благодаря @Zgarb за отрубание 8 символов.

,;w`i@/`MΣ*l

Попробуйте онлайн!

Пример ввода:

a(m) = m·(e1/p1 + e2/p2 + ... + en/pn)

Как это работает:

m = p1e1·p2e2·...·pnen ||answer||

Пиф — 10 8 байт

Обожаю неявный ввод! Должен привести его на один уровень с Джелли по большинству вещей (кроме навыков игры в гольф Денниса).

n

Тестовый набор.

p1...pn ||answer||

Хаскель, 59 байт

m·(1/p1 + 1/p2 + ... + 1/pn)

Реализует рекурсивное определение напрямую с помощью вспомогательной переменной. m that counts up to search for potential prime factors, starting from Dict . Последняя строка — это основная функция, которая подключает n->n^2>1?sum(p->n÷/(p...),factor(n^2))/2:0 to the binary function defined in the first line.

Функция проверяет каждый случай по очереди:

  • Если def a(n) s = 0 m = n.abs (2...m).each do |z| while m%d == 0 m /= d s += n / d end end if s == 0 if n > 1 s += 1 # if s is 0, either n is prime and the while loop added nothing, so add 1 # or n.abs < 2, so return 0 anyway # 0**s is used in the code because it returns 1 if s == 0 and 0 for all other s end end return s end , then > a=->n{s=0;(2...m=n.abs).map{|d|(m/=d;s+=n/d)while m%d<1};m<2?0:s+0**s} > a[299792458] 196831491 является одним из ->n{s=0;(2...m=n.abs).map{|d|(m/=d;s+=n/d)while m%d<1};m<2?0:s+0**s} , and the result is n .
  • Если p1...pn is not a multiple of m·(1/p1 + 1/p2 + ... + 1/pn) , затем увеличьте m and continue.
  • В противном случае выразите {+/⍵÷э|⍵} { } A dfn, a function in {} brackets. ?|⍵ The prime factors of the absolute value of our input. ⍵÷ Then divide our input by the above array, giving us a list of products for the product rule. +/ We sum the above numbers, giving us our arithmetic derivative. , and by the "derivative" property, the result is {+/⍵÷э|⍵} , что упрощает ÒU©a k £/X because r*p==n является простым.

Последний случай сохраняет байты обязательность mod n p>0 in a guard, что также позволяет избежать r for the boilerplate otherwise . Если 1>0 could be bound earlier, the second condition r можно проверить как p , which is 3 bytes shorter, but I don't see how to do that.

 

Opafranz


Рег
06 Feb, 2012

Тем
59

Постов
194

Баллов
499
  • 26, Oct 2024
  • #7

APL (расширенный диалог), 13 9 байт

Простое решение. Версия Dyalog Unicode была просто более длинной версией, поэтому она была опущена.

Редактировать: Сэкономлено 4 байта за счет применения метода из желейный раствор лиртосиаста.

r*a(p)+p*a(r)

Попробуйте онлайн!

Унгольфинг

n=p*r ||answer||

Рубин, 87 66 80 75 70 68 байт

Этот ответ основан на Ответ Луиса Мендо на MATL, ответ Витагора на Pythonи идея о том, что арифметическая производная числа p is equal to p где n is every prime factor of 0 к множественности.

-1,0,1

Эта функция вызывается следующим образом:

n

Унгольфинг:

n*n<2 ||answer||

Юля, 72 43 байта

p=2

Это анонимная функция, которая принимает целое число и возвращает число с плавающей запятой. Чтобы вызвать его, присвойте его переменной.

Для входного целого числа н, если н2 ≤ 1 возвращает 0. В противном случае получите простую факторизацию н2 как 2 , then for each prime/exponent pair, divide the prime by its exponent, then divide н по результату. Это просто вычисления н х / п, где п является основным фактором и х - его показатель, который аналогичен суммированию н / п, х раз. Суммируем полученный массив и делим его на 2, так как мы просуммировали вдвое больше, чем нам нужно. Это связано с тем, что мы факторизуем н2 скорее, чем н. (Это на байт короче, чем факторизация |н|.)

Сэкономлено 29 байт благодаря Денису!

 

Djshankarar


Рег
27 Jan, 2008

Тем
86

Постов
196

Баллов
656
  • 26, Oct 2024
  • #8

Серьезно, 17 14 11 12 байт

Мой первый серьезный ответ. Этот ответ основан на Ответ Луиса Мендо на MATL и идея о том, что арифметическая производная числа p is equal to n%p|n*n<2=0|mod n p>0=n%(p+1)|r<-div n p=r+p*r%2 (%2) где * Times the input, implicitly (This also adds the sign back in) s Sum cL1 Reciprocal mapped over lit P Prime factorization .a Absolute value of input, implicitly is every prime factor of *scL1P.a к множественности. Мое дополнение состоит в том, чтобы отметить, что если 0:`(*[:+/%@q:@|)@.* N XX`[email protected] if Z then Y else X end 0: X: return 0 Z Z: signum(N) (*[:+/%@q:@|) Y: N*add_all(reciprocal_all(all_prime_factors(abs(N)))) N * * [:+/ add_all( ) %@ reciprocal_all( ) q:@ all_prime_factors( ) | abs( ) N , then 0:`(*[:+/%@q:@|)@.* _8 _12 0:`(*[:+/%@q:@|)@.* 0 0 0:`(*[:+/%@q:@|)@.* 8 12 . Благодаря Мего за игру в гольф и помощь в исправлении ошибок. Попробуйте онлайн!

0:`(*[:+/%@q:@|)@.*

Унгольфинг:

n#(x:_)|y<-div n x=x*a y+y*a x;_#_=1 a n|n<0= -a(-n)|n<2=0|1<2=n#[i|i<-[2..n-1],mod n i<1] ||answer||

Йольф, 13 байт

a

Престижность за ответ MATL на алгоритм! Попробуйте здесь, или протестируйте их все сразу. (Выводит [key,out] в массиве.)

Объяснение

a ||answer||

Математика 10.0, 39 байт

a ||answer||

APL(NARS), 35 символов, 70 байт

a=b=input() d=2 s=0 while a*a>1: if a%d<1:a/=d;s+=b/d else:d+=1 print s

тест и как использовать:

a=b=input() d=2 s=0 while abs(a)>1: if a%d<1:a/=d;s+=b/d else:d+=1 print s

Я думал, что это будет неправильно, потому что я не знаю, является ли переменная c составной (а не простой)... Но для теста это нормально...

 

Dmitry07


Рег
04 Jun, 2007

Тем
64

Постов
187

Баллов
527
  • 26, Oct 2024
  • #9

05AB1E, 7 4 байты

a=b=input() d=2 s=0 while d<=abs(b): if a%d==0:a/=d;s+=b/d else:d+=1 print s

Порт @lirtosiast's Jelly ответ.

Попробуйте онлайн или проверить все тестовые случаи.

Объяснение:

a=b=input() d=2 s=0 while d<=abs(b): if a%d==0: a=a/d s+=b/d else: d+=1 print s ||answer||

Виксал o¬AÆfİS× Main link. Inputs: n o¬ Logical OR of n with its logical NOT That is, 0 goes to 1 and everything else goes to itself. A Then take the absolute value Æf get its list of prime factors İ divide 1 by those S sum × and multiply by the input. , 3 bytes

0

Попробуйте онлайн!

ÆfḟṠ³:S

-1 спасибо Underslash

 

Matfeus


Рег
28 Mar, 2004

Тем
68

Постов
189

Баллов
529
  • 26, Oct 2024
  • #10

Перл 5, 62 байта

f(n) == p*f(n/p)+n/p

Использует формулу (из OEIS): p

 

Kabdushn


Рег
25 Nov, 2019

Тем
96

Постов
220

Баллов
730
  • 26, Oct 2024
  • #11

Перл 6, 90

n

Это может быть немного медленно для больших чисел. Заменять f(prime)=1 with f=lambda n,p=2:+(n*n>1)and(n%p and f(n,p+1)or p*f(n/p)+n/p) для более длинного кода, но более быстрого вычисления.

 

Shuhrat


Рег
15 Oct, 2006

Тем
65

Постов
139

Баллов
474
  • 26, Oct 2024
  • #12

Чернила, 183 байта

|1> % take input's absolute value. Is it greater than 1? ? % if so: Gt % push input twice Yf % prime factors. For negative input uses its absolute value / % divide element-wise s % sum of the array } % else: 0 % push 0

Попробуйте онлайн!

Я отказываюсь верить, что это хорошее решение, но я также не вижу способа его улучшить.

 

Remek


Рег
09 Jul, 2005

Тем
97

Постов
210

Баллов
695
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно