Biorąc pod uwagę liczbę pierwszą P
większą niż 10
, twój program lub funkcja musi ustalić zasadę podzielnościx
liczbę , zdefiniowaną jako liczba całkowita o najmniejszej wartości bezwzględnej, która daje wielokrotność pierwotnej liczby pierwszej, pomnożonej przez ostatnią cyfrę liczby pierwszej i dodanej do reszty oryginału główny.
Przykład
Biorąc pod uwagę 31
, ostatnia cyfra to, 1
a reszta liczby to 3
. Dlatego twój program musi znaleźć liczbę całkowitą x
o minimalnej wartości bezwzględnej, która 1*x + 3
jest wielokrotnością 31
. W takim przypadku x=-3
działa, więc program lub funkcja powróci -3
.
Biorąc pod uwagę 1000003
, ostatnia cyfra to, 3
a reszta liczby to 100000
. W ten sposób Twój program znajdzie, x=300001
ponieważ 3*300001+100000 = 1000003
jest to wielokrotność1000003
.
Tło matematyczne
Wartość x
można wykorzystać jako test podzielności. Jeśli liczba N
jest podzielna przez P
, to dodanie x
czasów ostatniej cyfry N
do reszty N
da wielokrotność P
if i tylko jeśli N
jest podzielna przez P
.
Dla P=11
otrzymujemy x=-1
, który jest odpowiednikiem znanego cecha podzielności przez 11
: liczba jest podzielna przez 11
różnicę przemiennym jej cyfr jest podzielna przez 11
.
Zasady
- Dane wyjściowe mogą być w dowolnej formie, która wyraźnie koduje zarówno znak, jak i wartość wyniku.
- Liczba wejściowa będzie wynosić między 10 a 2 ^ 30.
- Nie trzeba obsługiwać, jeśli dane wejściowe nie są liczbą pierwszą lub nie znajdują się w zakresie.
- Nie trzeba do uchwytu, gdy oba
x
i-x
są ważne wyjścia (nie powinno się zdarzyć). - Brutalna siła jest dozwolona, ale bardziej kreatywne rozwiązania są doceniane.
- To jest golf golfowy , więc wygrywa najkrótszy kod w każdym języku ! Nie pozwól, aby odpowiedzi w językach golfowych zniechęcały Cię do publikowania postów w innych językach.
Przypadki testowe
Input Output
11 -1
13 4
17 -5
19 2
23 7
29 3
31 -3
37 -11
41 -4
43 13
47 -14
53 16
59 6
61 -6
67 -20
71 -7
73 22
79 8
83 25
89 9
97 -29
101 -10
103 31
107 -32
109 11
113 34
127 -38
131 -13
1000003 300001
2000003 600001
2999999 300000
9999991 -999999
źródło
x
wartości bezwzględnej, która10*x-1
jest podzielna przez dane wejściowe.(3 / (n % 5 * 2 - 5) * n + 1) / 10
i(n % 5 * 2 - 5^2) * n / 10 + 1
jest w stanie znaleźć minimalną wartość bezwzględną dla czegoś takiego? Moją pierwszą intuicją byłoby obliczenie najmniejszej wspólnej wielokrotności za pomocą największego wspólnego dzielnika obliczonego za pomocą algorytmu Euclida.x
, dodać ją i nadal uzyskać liczbę podzielną przezn
. Jeśli następnie pomnożymy nowy numer przez 10 i odejmiemy pierwotny numer, nadal będzie on podzielny przezn
. Komentarz xnora wynika z algebry. Następnym krokiem jest zmienić wzór tak, że dajex
w zakresie odn
X =(k*n+1)/10
. Chcemy najmniejszy absolutnyx
tak dlatego chcemy najmniejszy absolutnyk
, a to musi być którykolwiek jeden-3
,-1
,1
lub3
(w zależności odn
„s ostatnia cyfra), który sprawia, że dokładny podział.Odpowiedzi:
JavaScript (ES6),
322523 bajtów3/(n%5*2-5)
napisałbym,9/n(mod -10)
gdybym miał dostęp do zrównoważonego podziału modulo. Edycja: Zapisano 2 bajty dzięki @EgorSkriptunoffźródło
n=>((n%10*2%14-3)*n+1)/10
zn=>(3/(n%5*2-5)*n+1)/10
Python 2 , 27 bajtów
Wypróbuj online!
Operacje są wykonywane od lewej do prawej:
(((n%5)*2)-5)^2
.Użyłem mojego arytmetycznego brutalnego forcera, aby znaleźć wyrażenie
n%5*2-5^2
do wykonania{1:-1,3:3,2:-3,4:1}[k]
, przyjmując ujemną odwrotność reszty mod 5 w zakresie[-2..2]
.źródło
3/(n%5*2-5)
ma taką samą długość jak(n%5*2-5^2)
.)n%5*2-6^3
. Spojrzałem tylko na długość wyrażenia bez parenów, podczas gdy3/(n%5*2-5)
jest on o dwa znaki dłuższy, ale oszczędza na parenach zewnętrznych ze względu na pierwszeństwo. Wyszukiwanie wyrażeń o tej długości powinno chwilę potrwać. Ten przypadek użycia sugeruje opcję znalezienia tylko wyrażeń, które mogą być użyte w danym kontekście poprzez ich najbardziej zewnętrzną operację mającą wystarczająco wysoki priorytet.Galaretka ,
108 bajtówWypróbuj online!
Objaśnienia
źródło
Brachylog , 14 bajtów
Wypróbuj online!
źródło
Python 2 ,
695453 bajtówEdycja: -15 bajtów dzięki @ Mr.Xcoder
Edytuj: -1 bajt za pomocą rekurencji
Wypróbuj online!
źródło
Python 2 ,
31 2927 bajtówWypróbuj online!
źródło
Japt ,
169 bajtówZaoszczędzono o wiele za dużo bajtów dzięki obserwacji @xnor
Przetestuj online! Przy większych nakładach może to potrwać kilka sekund.
Wyjaśnienie
źródło
Java 8,
2321 bajtówPort odpowiedzi JavaScrip (ES6) @Neil , ale -2 bajty dzięki @Nevay z powodu niejawnej podłogi liczb całkowitych.
Wypróbuj tutaj.
źródło
n->3/(n%5*2-5)*++n/10
Pyke , 12 bajtów
Wypróbuj tutaj!
źródło
Pyth , 14 bajtów
Wypróbuj tutaj.
źródło
Python 2 ,
4443 bajty(Przekreślone 44 to wciąż 44.) Dzięki Fireflame241 za uratowanie bajtu!
Wypróbuj online!
Jest dokładnie jedna liczba pomiędzy
0
iP-1
która jest odwrotnością10
. Ale jeśli ta odwrotnośću
jest większa niżP/2
, to(u-P)
jest również odwrotnością i ma mniejszą wartość bezwzględną niżu
. Okazuje się więc, że naprawdę szukamy unikalnej liczbyx
pomiędzy-P/2
iP/2
która jest odwrotnością10
.Powyższy kod robi dokładnie to, zaczynając od (najniższy poziom)
P/2
i schodząc w dół, aż do osiągnięcia odwrotności. To musi się zdarzyć dla pewnej liczby większej niż-P/2
tak długo, jak liczbaP
pierwsza jest większa niż10
. Mówiąc dokładniej, zakończy się wtedy i tylko wtedy, gdyP
jest chroniony prawem autorskim10
.Edycja: Okazuje się, że
x
na pewno jest pomiędzy-P/3
iP/3
, więc bieżąca wersja zaczyna się odP/3
i schodzi z tego miejsca. Wyjaśnienie tego znajduje się w sekcji „ Poprawiona granica” .Wyjaśnienie matematyczne
Nie od razu zrozumiałem, dlaczego zadziałał test podzielności. Oto wyjaśnienie, na wypadek gdyby ktoś się zastanawiał.
Niech
P
będzie liczbą pierwszą, większą niż10
, której ostatnią cyfrą jestb
. A zatemP = 10a + b
gdzie
a > 0
i0 <= b < 10
. W rzeczywistościb
jest albo1
,3
,7
, lub9
, z powodu doskonałej większy niż10
końcowy musi w jednej z tych cyfr.Załóżmy teraz
bx + a = 0 (mod P)
. Następniea = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Ponieważ
P
jest liczbą pierwszą, liczby całkowitemod P
są domeną integralną . Więc albob = 0 (mod P)
, albo1 - 10x = 0 (mod P)
.Wiemy
0 <= b < 10 < P
, więc jeślib = 0 (mod P)
potemb = 0
. Ale my powiedzieliśmyb
albo jest1
,3
,7
, lub9
, więc jest to niemożliwe. Dlatego1 - 10x = 0 (mod P)
tak10x = 1 (mod P)
. Innymi słowy,x
jest odwrotnością10
moduloP
.Załóżmy teraz, że
N
jest nieujemną liczbą całkowitą, której ostatnia cyfra tod
, więcN = 10c + d.
mamy łańcuch równoważnych instrukcji:10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
CO BYŁO DO OKAZANIA.
Przydatność?
Zastanawiałem się również, czy test podzielności (podany
N = 10c + d
, zastąpionyN
przezdx + c
) rzeczywiście byłby produktywny w praktyce. Czy przynajmniej rzetelnie zastępujeN
go liczbą mniejszą niżN
(w wartości bezwzględnej)?Załóżmy
N = 10c + d
, gdziec >= 0
i0 <= d < 10
. W związku z tym10c = N - d <= N
. Przez nierówność trójkąta|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Jeśli więc
5P <= 9N/10
to|c + dx| < N
.W szczególności, jeśli
N >= 6P
, to|c + dx| < N
. Tak więc, biorąc pod uwagęP
zaczynamy od obliczenia2P
,3P
, ...,6P
wraz zx
. Następnie podanoN
, prowadzimy wielokrotnie test podzielności aż osiągniemy liczbę mniejszą niż lub równy6P
, i sprawdzić, czy wynik jest każda z liczb0
,P
,2P
, ...,6P
.(Oczywiście, ilekroć osiągniemy liczbę ujemną, zastępujemy ją wartością bezwzględną, co jest w porządku, ponieważ
q
można ją podzielić przez „P
tylko i tylko jeśli”(-q)
).Ulepszona granica
Zauważyłem, że
|x|/P
nigdy nie było tak blisko1/2
. W rzeczywistości wydawało się, że zawsze było mniej niż1/3
... lub po bliższym zbadaniu, był zawsze bardzo blisko albo1/10
albo3/10
. Wydawało się, że jest ono największe4/13
(co dzieje się, kiedyP=13
ix=4
). Dlaczego miałoby to być?Niech
u
będzie liczbą całkowitą i załóżmy, że10u = kP + 1
dla jakiejś liczby całkowitejk
, taku
jest odwrotnie10
, moduloP
. Wiemy również, żek
jest to względnie pierwszy10
, ponieważk(-P)
jest równoważne1
modulo10
.Teraz wiemy, że wszystkie odwrotności
10
moduloP
różnią się wielokrotnościamiP
, więc możemy wziąć liczbę całkowitąu
i dodawać lub odejmować wielokrotności wedługP
woli, a wynik zawsze będzie odwrotnością10
moduloP
. Załóżmy, że zdecydujemy się odjąćP
odu
: otrzymujemy10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Innymi słowy, zmniejszenie (odpowiednio zwiększenie)
u
oP
odpowiada zmniejszeniu (wzrost)k
o10
. Chcemy dodawać / odejmować wielokrotnościP
od,u
aż lewa strona zostanie zminimalizowana w wartości bezwzględnej; ale po lewej stronie jest dokładnie zminimalizowane, gdy po prawej stronie jest zminimalizowane, a więc chcemy dodać / odjąć10
odk
dopóki po prawej stronie jest minimalizowane w wartości bezwzględnej.Ale wiemy, że to się stanie, gdy
k
jest między-5
i5
, a więc (ponieważk
jest stosunkowo prime do10
) to oznaczak
to albo-3
,-1
,1
, lub3
. (To jest treść komentarza @ Neil w OP. Dzięki, Neil! )Tak więc, gdy
|u|
jest zminimalizowany (tju=x
), będziemy miećx/P = u/P = k/10 + 1/(10P)
, gdziek
jest albo-3
,-1
,1
, lub3
. W związku z tym|x|/P <= 3/10 + 1/(10P)
. Odpowiednio|x| <= (3P + 1)/10
.Co więcej, nierówność ta jest surowa w
P=11
, ponieważ wP=11
mamyx=-1
ik=-1
. Najmniejsze,P
dla którego obowiązuje równość, toP=13
(gdziex=4
ik=3
).Dlatego największa,
|x|/P
jaka kiedykolwiek dostaje, jest3/10 + 1/(10*13)
, ponieważP=13
jest to pierwsza liczba pierwsza, dla której mamyk=3
, a wśród tych zk=3
,1/(10P)
termin jest największy, gdyP
jest najmniejszy (tj. AtP=13
). Dlatego też wszyscyP
mamy|x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. To wyjaśnia, dlaczego w powyższym kodzie możemy zainicjować o,i = P/3
zamiast zaczynać odP/2
.Ponadto można teraz poprawić granice w powyższej sekcji Przydatność .
Lemma : Niech
N = 10c + d
gdziec > 0
i0 <= d <= 9
. Potemc + d|x| < N/10 + 9(3P + 1)/10
. (Zwróć uwagę na ścisłą nierówność.)Dowód lematu: według przypadków. Przypadek I:
d = 0
takN = 10c
. Potemc + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.Przypadek II:
0 < d <= 9
. Więc10c = N - d < N
takc < N/10
. W związku z tymc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. CO BYŁO DO OKAZANIA.Zatem jeśli
N > 3P
(iN = 10c + d
jak poprzednio), to3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
Więc jeśli
N > 3P
takc + d|x| < N
.Dlatego też, musimy tylko znaleźć
P
,2P
a3P
wraz zx
. Biorąc pod uwagęN > 0
, natomiastN > 3P
, możemy zastąpićN
przez|c + dx|
, co zmniejszaN
. W końcu dostaniemyN <= 3P
; W tym momencie możemy zatrzymać się i sprawdzić, czyN
jest równa żadnej z liczb0
,P
,2P
, lub3P
.Nie możemy zrobić nic lepszego niż
3P
ogólnie. Załóżmy na przykładP = 13
iN = 39
takx = 4
. Następnie zastąpioneN
przezdx + c = 9(4) + 3
liścieN
bez zmian.źródło
-1
poza nawias: 43 bajtyBiała spacja , 92 bajty
Zauważ, że składnia tego języka składa się tylko z białych znaków , więc każdy znak białych znaków ma tutaj przedrostek S, T lub L (odpowiednio odpowiednio Spacja, Tab i Przesuw wiersza). Można je usunąć bez utraty funkcjonalności, ale są tu zawarte w celu poprawnego wyświetlenia.
Wypróbuj online!
źródło
Japt , 14 bajtów
Zainspirowany rozwiązaniem Neila .
Przetestuj online!
Wyjaśnienie:
źródło
Pyke , 10 bajtów
Wypróbuj tutaj!
źródło
Excel, 27 bajtów
Można wprowadzić do komórki jako
dla 25 bajtów, ale automatyczne aktualizacje programu Excel.
źródło