Apakah ini faktor polinomial?

11

Polinomial dapat dibagi dengan faktor (x-n)jika f(n)=0untuk suatu fungsi f. Pekerjaan Anda: untuk menentukan apakah fungsi polinom f(x)dapat dibagi oleh (x-n).

Input

Masukan dalam bentuk (x-n), (Polynomial). Ingat, jika n negatif, (x-n)akan dalam bentuk input dari(x+n) . Untuk polinomial, semua eksponen akan dimasukkan sebagai ^. Koefisien akan ditulis di sebelah variabel x. Contoh polinomial bisa jadi 2x^2 + x^1. Tidak akan ada ruang di antara apa pun. Istilah xakan dimasukkan sebagai x^1. Jadi seperti apa yang "normal" (x - 1)nantinya (x^1-1). Koefisien dan kekuatan akan selalu berupa bilangan bulat. Koefisien satu akan tersirat jika itu adil x. Yaitu, xbisa diartikan sebagai1x

Hasil

Nilai boolean. Truthy, atau Falsey.

Terima kasih kepada @AlexA. Untuk membantu saya memperjelas ini!

Contohnya

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

Aturan

  • Ini adalah , jadi kode terpendek dalam byte menang

Sayangnya, saya tidak tahu bagaimana menerapkan leaderboard snippet. Jika ada yang tahu caranya, silakan mengedit posting.

intboolstring
sumber
Akankah input menjadi string dengan bentuk yang tepat, yaitu parens di sekitar kandidat pembagi, koma dengan nol atau satu spasi, dan parens di sekitar polinomial?
Alex A.
2
Kemungkinan rangkap
intrepidcoder
Jelas bukan duplikat dari itu.
intboolstring
@intrepidcoder Ini bukan duplikat karena pertanyaannya bukan faktor polinomial. Ini untuk melihat apakah polinomial dapat dibagi dengan faktor linier.
intboolstring
Apakah koefisien polinomial selalu menjadi bilangan bulat?
Trauma Digital

Jawaban:

5

Pyth - 39 byte

Ini adalah kombinasi mengerikan dari regexp dan eval. Saya suka pendekatannya, tetapi akan mencoba meningkatkan implementasinya.

Ia menggunakan Teorema Sisa Polinomial .

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

Tidak bekerja online karena penggunaan eval.

Maltysen
sumber
3

Casio Basic, 19 byte

judge(mod(b,a)=0

Ternyata, fx-CP400 dapat dilakukan modpada ekspresi aljabar!

Polinomial dan faktor harus dimasukkan sebagai ekspresi. 16 byte untuk kode, 3 byte untuk dimasukkan a,bke dalam kotak nilai parameter.

numbermaniac
sumber
1

MATLAB, 103 99 97 95 93 byte

Saya mencoba beberapa hal berbeda, dan membuatnya berfungsi untuk menghemat beberapa byte:

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

Jika saya dapat mengurangi itu lebih jauh, saya akan memposting penjelasan.


Kode lama penjelasan

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

Ini juga berfungsi dengan Oktaf . Anda dapat mencobanya secara online . Saya telah menyimpan program sebagai skrip bernama isFactor.m, jadi Anda bisa langsung masuk isFactorsaat diminta. [Catatan: dalam Oktaf mengeluarkan peringatan saat berjalan - MATLAB tidak menghasilkan ini].

Masukan harus dalam format '(x^1+7),(x^2-49)'sesuai pertanyaan. Tanda kutip ditambahkan sehingga MATLAB / Oktaf tahu itu adalah string.

Outputnya adalah a 0atau a 1tergantung pada apakah itu benar atau salah.


Jadi, kodenya berfungsi sebagai berikut. Pertama kita meminta input, dan kemudian menguraikannya. String parsing mengekstraksi nomor yang ditandatangani setelah yang pertama (x^1dalam string - ini adalah nilai kami n. Kemudian terus mengekstraksi string ( %s) setelah ),di input - ini adalah ekspresi kami.

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

Selanjutnya, kita mengekstrak nilai ndan menyetel xsama dengan itu - kita akan mengevaluasi apakah ekspresi sama dengan nol kapan n==x, jadi ini sebabnya kita menyimpan nilai ke x. Kami juga meniadakan angka yang diekstraksi, karena tanda minus ketika parsing.

x=-t(1);

Kami kemudian akan menampilkan output yang merupakan boolean

disp(

Output pada dasarnya adalah negasi logis dari persamaan yang kami evaluasi. Jika f(x)nol, ini akan mengembalikan 1, jika tidak maka akan menghasilkan nol.

     ~eval(

Kami sedang mengevaluasi ekspresi input, tetapi untuk melakukan ini, kita perlu memformat ulangnya sedikit agar MATLAB dapat mengerti. Ketika kita membaca string, sebenarnya itu adalah array doubletipe, jadi kita perlu mengonversinya menjadi array karakter. Sebelum konversi, kami juga menyingkirkan elemen pertama karena itulah yang kami gunakan untuk itu n. Kita kemudian perlu mengganti kejadian xyang didahului oleh angka (misalnya 4x) dengan hal yang sama tetapi dengan multiplikasi ( *) masuk di antaranya sehingga MATLAB dapat menghitungnya.

           regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
     )
)
Tom Carpenter
sumber
1

VBScript, 118 116 byte

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)))

Karena kita tahu bahwa bagian pertama dari input adalah polinomial linier, kita hanya perlu memeriksa apakah akarnya cocok dengan polinomial kedua; dan kita perlu menyiapkan istilah evaldengan memasukkan *sesuai kebutuhan.

Hilbert
sumber
1

Aksioma 77 180 Bytes

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)

solusi sebelumnya

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

salah karena menganggap derajat (b)> = derajat (a) satu bug yang saya tulis ... tes dan hasil

(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
sumber