Czy jest to czynnik wielomianu?

11

Wielomian jest podzielny przez współczynnik, (x-n)jeśli f(n)=0dla funkcji f. Twoje zadanie: ustalenie, czy funkcja wielomianowa f(x)jest podzielna przez(x-n) .

Dane wejściowe

Dane wejściowe mają postać (x-n), (Polynomial). Pamiętaj, jeśli n jest ujemne, (x-n)będzie miało postać wejściową(x+n) . W przypadku wielomianu wszystkie wykładniki zostaną wstawione jako ^. Współczynniki zostaną zapisane obok zmiennej x. Przykładowym wielomianem może być 2x^2 + x^1. Nie będzie między nimi żadnych odstępów. Termin xzostanie wprowadzony jako x^1. Więc co by „normalnie” wyglądać (x - 1)będzie (x^1-1). Współczynniki i moce zawsze będą liczbami całkowitymi. Współczynnik jeden będzie domyślny, jeśli jest sprawiedliwy x. Tj. xMożna to interpretować jako1x

Wyjście

Wartość logiczna. Prawda lub Falsey.

Dzięki @AlexA. Za pomoc w wyjaśnieniu tego!

Przykłady

Input:(x^1-1),(x^1-1)
Output: True

Input: (x^1+2),(2x^2+4x^1+2)
Output: False

Input: (x^1+7),(x^2-49)
Output: True

Zasady

  • To jest , więc wygrywa najkrótszy kod w bajtach

Niestety nie wiem, jak zaimplementować tabelę wyników. Jeśli ktoś wie jak, możesz edytować post.

introolstring
źródło
Czy dane wejściowe będą ciągiem o dokładnie takiej formie, tj. Parens wokół kandydata na dzielnik, przecinek z zerową lub jedną spacją i parens wokół wielomianu?
Alex A.
2
Możliwy duplikat
intrepidcoder
Na pewno nie duplikat tego.
introolstring
@intrepidcoder To nie jest duplikat, ponieważ pytanie nie ma uwzględniać wielomianu. Sprawdza, czy wielomian można podzielić przez współczynnik liniowy.
introolstring
Czy współczynniki wielomianowe zawsze będą liczbami całkowitymi?
Cyfrowy uraz

Odpowiedzi:

5

Pyth - 39 bajtów

Jest to monstrualna kombinacja wyrażeń regularnych i eval. Podoba mi się to podejście, ale postaram się poprawić wdrożenie.

Korzysta z twierdzenia o wielomianowej reszcie .

K_sPe:z"-|\+"3!v.ssXPtw,\^\x,"**""*K"\*

Nie działa online z powodu ewaluacji.

Maltysen
źródło
3

Casio Basic, 19 bajtów

judge(mod(b,a)=0

Jak się okazuje, fx-CP400 może to zrobić mod na wyrażeniach algebraicznych!

Wielomian i czynnik należy wprowadzić jako wyrażenia. 16 bajtów na kod, 3 bajty na a,bpole wartości parametru.

NumberManiac
źródło
1

MATLAB, 103 99 97 95 93 bajtów

Próbuję różnych rzeczy i udało mi się zaoszczędzić kilka bajtów:

eval([regexprep(input(''),{'.+?1(.+)\),','(\d)x'},{'x=str2num(''$1'');disp(~','$1\*x'}) 41]);

Jeśli mogę to jeszcze bardziej zmniejszyć, opublikuję wyjaśnienie.


Stary kod wyjaśnienie

t=sscanf(input(''),'(x^1%d),%s')';x=-t(1);disp(~eval(regexprep([t(2:end) ''],'(\d)x','$1\*x')))

Działa to również z Octave . Możesz spróbować online . Zapisałem program jako skrypt o nazwie isFactor.m, więc możesz po prostu wejśćisFactor w linii poleceń. [Uwaga: w Octave wyrzuca ostrzeżenie podczas działania - MATLAB tego nie generuje].

Dane wejściowe muszą mieć format '(x^1+7),(x^2-49)' zgodny z pytaniem. Znaki cudzysłowu są dodawane, aby MATLAB / Octave wiedział, że jest to ciąg znaków.

Dane wyjściowe mają wartość a 0lub 1zależną od tego, czy jest to prawda, czy fałsz.


Tak więc kod działa w następujący sposób. Najpierw poprosimy o dane wejściowe, a następnie je przeanalizujemy. Ciąg parsujący wyodrębnia podpisany numer po pierwszym (x^1w ciągu - jest to nasza wartość n. Następnie kontynuuje wyodrębnianie string ( %s) po ),danych wejściowych - to jest nasze wyrażenie.

t=sscanf(input(''),'(x^1%d),%s')';

Następnie wyodrębniamy wartość ni ustawiamy xją na równi - sprawdzimy, czy wyrażenie ma wartość zero, kiedy n==xto dlatego przechowujemy wartość na x. Negujemy również wyodrębnioną liczbę ze względu na znak minus podczas analizy.

x=-t(1);

Następnie wyświetlimy wynik, który jest wartością logiczną

disp(

Wynik jest w zasadzie logiczną negacją naszego ocenianego równania. Jeśli f(x)wynosi zero, to zwróci 1, w przeciwnym razie spowoduje zero.

     ~eval(

Oceniamy wyrażenie wejściowe, ale w tym celu musimy go nieco sformatować, aby MATLAB mógł to zrozumieć. Kiedy czytamy ciąg, jest to właściwie tablica doubletypu, więc musimy przekonwertować go na tablicę znaków. Przed konwersją pozbywamy się również pierwszego elementu, ponieważ do tego właśnie służyliśmy n. Następnie musimy zastąpić każde wystąpienie, xktóre jest poprzedzone liczbą (np. 4x), Tą samą rzeczą, ale przez znak mnożenia ( *), aby MATLAB mógł to obliczyć.

           regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
     )
)
Tom Carpenter
źródło
1

VBScript, 118 116 bajtów

a=inputbox(""):for i=0 to 9:a=replace(a,i&"x",i&"*x"):next:b=split(a,","):x=-eval(b(0)):msgbox not cbool(eval(b(1)))

Ponieważ wiemy, że pierwsza część danych wejściowych jest wielomianem liniowym, musimy tylko sprawdzić, czy jej pierwiastek odpowiada pierwiastkowi drugiego wielomianu; i musimy przygotować termin eval, wstawiając *w razie potrzeby.

Hilbert
źródło
1

Axiom 77 180 bajtów

f(a:UP(x,INT),b:UP(x,INT)):Boolean==(ground?(a)or ground?(b)=>false;p:=b;r:=a;if degree(a::POLY INT,x)>degree(b::POLY INT,x)then(p:=a;r:=b);(p rem r)$UP(x,FRAC INT)~=0=>false;true)

poprzednie rozwiązanie

v(a,b)==(ground?(a) or ground?(b) or (b rem a)$UP(x,FRAC INT)~=0=>false;true)

było błędne, ponieważ zakładam stopień (b)> = stopień (a) jeden błąd, który napisałem ... test i wyniki

(3) -> f(x^1-1,x^1-1)
   (3)  true
                                                            Type: Boolean
(4) -> f(x^1+1,2*x^2+4*x^1+2)
   (4)  true
                                                            Type: Boolean
(5) -> f(x^1+2,2*x^2+4*x^1+2)
   (5)  false
                                                            Type: Boolean
(6) -> f(x^1+7,x^2-49)
   (6)  true
                                                            Type: Boolean
(7) -> f(1, 1)
   (7)  false
                                                            Type: Boolean
(8) -> f(1, x^2+1)
   (8)  false
                                                            Type: Boolean
(9) -> f(x^8-1, x^2-1)
   (9)  true
RosLuP
źródło