มันเป็นปัจจัยของพหุนามหรือไม่?


11

พหุนามคือหารด้วยปัจจัย(x-n)ถ้าสำหรับฟังก์ชั่นf(n)=0 fงานของคุณ: เพื่อตรวจสอบว่าฟังก์ชันพหุนามf(x)หารด้วย(x-n)หรือไม่

การป้อนข้อมูล

(x-n), (Polynomial)การป้อนข้อมูลที่อยู่ในรูปแบบของ จำไว้ว่าถ้า n เป็นลบ(x-n)(x+n)จะอยู่ในรูปแบบของการป้อนข้อมูล สำหรับพหุนาม, ^เลขยกกำลังทั้งหมดจะถูกวางในฐานะ xค่าสัมประสิทธิ์จะเขียนต่อไปให้กับตัวแปร 2x^2 + x^1พหุนามตัวอย่างเช่นอาจจะ จะไม่มีช่องว่างระหว่างสิ่งใด คำที่xจะ inputed x^1เป็น ดังนั้นสิ่งที่จะ "ปกติ" มีลักษณะเหมือนจะเป็น(x - 1) (x^1-1)ค่าสัมประสิทธิ์และอำนาจจะเสมอเป็นจำนวนเต็ม ค่าสัมประสิทธิ์การหนึ่งที่จะเป็นนัยถ้ามันเป็นเพียงแค่ xเช่นxสามารถตีความได้ว่า1x

ผลลัพธ์

ค่าบูลีน ความจริงหรือเท็จ

ขอบคุณ @AlexA เพื่อช่วยฉันชี้แจงเรื่องนี้!

ตัวอย่าง

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

กฎระเบียบ

  • นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

น่าเสียดายที่ฉันไม่ทราบวิธีการใช้กระดานข้อมูลโค้ด หากใครรู้วิธีสามารถแก้ไขโพสต์


การป้อนข้อมูลจะเป็นสตริงที่มีรูปแบบที่แน่นอนเช่น parens รอบตัวหารตัวหารจุลภาคที่มีศูนย์หรือหนึ่งช่องว่างและ parens รอบพหุนาม
Alex A.


ไม่ซ้ำกันอย่างแน่นอน
intboolstring

@intrepidcoder นี่ไม่ได้ซ้ำกันเพราะคำถามนี้ไม่ได้มีส่วนเกี่ยวข้องกับพหุนาม มันคือดูว่าพหุนามสามารถหารด้วยปัจจัยเชิงเส้นได้หรือไม่
intboolstring

ค่าสัมประสิทธิ์พหุนามจะเป็นจำนวนเต็มเสมอหรือไม่
Digital Trauma

คำตอบ:


5

Pyth - 39 ไบต์

นี่คือการรวมกันอย่างผิดปกติของ regexp และ eval ฉันชอบวิธีการ แต่จะพยายามปรับปรุงการใช้งาน

โดยจะใช้ส่วนที่เหลือทฤษฎีบทพหุนาม

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

ไม่ทำงานออนไลน์เพราะใช้งานได้ไม่ดี


3

Casio Basic, 19 ไบต์

judge(mod(b,a)=0

ตามที่ปรากฎ fx-CP400 สามารถทำmodในการแสดงออกเกี่ยวกับพีชคณิต!

ควรป้อนพหุนามและตัวคูณเป็นนิพจน์ รหัส 16 ไบต์สำหรับ 3 ไบต์เพื่อป้อนa,bลงในกล่องค่าพารามิเตอร์


1

MATLAB, 103 99 97 95 93 ไบต์

ฉันกำลังลองทำสิ่งที่แตกต่างกันและทำให้สิ่งนี้สามารถบันทึกได้สองสามไบต์:

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

ถ้าฉันสามารถลดมันลงไปอีกฉันจะโพสต์คำอธิบาย


คำอธิบายรหัสเก่า

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

สิ่งนี้ยังทำงานร่วมกับอ็อกเทฟ คุณสามารถลองออนไลน์ได้ ฉันบันทึกโปรแกรมเป็นสคริปต์ชื่อisFactor.mดังนั้นคุณสามารถป้อนisFactorที่พรอมต์ [หมายเหตุ: ใน Octave แยกคำเตือนออกมาขณะที่ทำงาน - MATLAB จะไม่สร้างสิ่งนี้]

อินพุตจะต้องอยู่ในรูปแบบ'(x^1+7),(x^2-49)'ตามคำถาม เครื่องหมายคำพูดจะถูกเพิ่มเพื่อให้ MATLAB / Octave รู้ว่ามันเป็นสตริง

เอาต์พุตเป็น a 0หรือ a 1ขึ้นอยู่กับว่าเป็นจริงหรือเท็จ


ดังนั้นรหัสทำงานดังนี้ ก่อนอื่นเราขออินพุตจากนั้นวิเคราะห์คำ สตริงการแยกวิเคราะห์แยกหมายเลขที่เซ็นชื่อหลังจาก(x^1สตริงแรก- นี่คือค่าของnเรา จากนั้นมันจะยังคงดึงสตริง ( %s) หลังจาก),อินพุท - นี่คือการแสดงออกของเรา

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

ต่อไปเราจะแยกค่าของnและตั้งxค่าให้เท่ากัน - เราจะประเมินว่านิพจน์เท่ากับศูนย์เมื่อใดn==xดังนั้นนี่คือสาเหตุที่เราเก็บค่าไว้ที่ x นอกจากนี้เรายังคัดค้านจำนวนที่แยกเนื่องจากเครื่องหมายลบเมื่อแยกวิเคราะห์

x=-t(1);

จากนั้นเราจะแสดงผลลัพธ์ซึ่งเป็นบูลีน

disp(

ผลลัพธ์เป็นลบล้างตรรกะของสมการประเมินของเรา ถ้าf(x)เป็นศูนย์จะส่งคืน 1 มิฉะนั้นจะส่งผลให้เป็นศูนย์

     ~eval(

เรากำลังประเมินนิพจน์อินพุต แต่หากต้องการทำเช่นนี้เราต้องฟอร์แมตใหม่เล็กน้อยเพื่อให้ MATLAB สามารถเข้าใจได้ เมื่อเราอ่านสตริงมันเป็นอาร์เรย์doubleประเภทจริงดังนั้นเราจึงจำเป็นต้องแปลงสตริงนั้นเป็นอาร์เรย์อักขระ nก่อนการแปลงเรายังได้รับการกำจัดขององค์ประกอบเป็นครั้งแรกที่เป็นสิ่งที่เราใช้สำหรับ จากนั้นเราจำเป็นต้องแทนที่เหตุการณ์ที่เกิดขึ้นxก่อนหน้านี้ด้วยตัวเลข (เช่น4x) ด้วยสิ่งเดียวกัน แต่มีการ*ลงชื่อเข้าใช้การคูณ ( ) ระหว่างดังนั้น MATLAB สามารถคำนวณได้

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

1

VBScript, 118 116 ไบต์

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

เนื่องจากเรารู้ว่าส่วนแรกของอินพุตคือพหุนามเชิงเส้นเราเพียงแค่ต้องตรวจสอบว่ารูตนั้นตรงกับของพหุนามที่สองหรือไม่ และเราจำเป็นต้องเตรียมคำศัพท์สำหรับการevalแทรก*ตามความจำเป็น


1

ความจริง77 180 ไบต์

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)

ทางออกก่อนหน้า

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

ผิดเพราะมันถือว่าดีกรี (b)> = ดีกรี (ก) หนึ่งข้อบกพร่องที่ฉันเขียน ... การทดสอบและผลลัพธ์

(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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.