Yếu tố đa thức trên một trường hữu hạn hoặc các số nguyên


20

Không sử dụng bất kỳ hàm bao thanh toán / đa thức tích hợp nào, hãy biến một đa thức hoàn toàn thành các giá trị bất định trên các số nguyên hoặc một trường hữu hạn.

Đầu vào

Chương trình / chức năng của bạn sẽ nhận được một số số nguyên tố (hoặc số không) nlàm đầu vào. Trường / vòng là trường hữu hạn của thứ tự đó (nghĩa là Z/nZ) hoặc chỉ là Znếu n0. Chương trình của bạn có thể thất bại nếu nkhông 0hoặc là một nguyên tố. Đa thức sẽ ở F[x].

Chương trình / hàm của bạn cũng sẽ nhận được đa thức làm đầu vào.

Có một số linh hoạt trong đầu vào, hãy chắc chắn để xác định cách bạn dự định nhận đầu vào. Ví dụ: đa thức có thể được nhập dưới dạng danh sách các hệ số hoặc ở dạng mà hầu hết mọi người mong đợi (ví dụ 50x^3 + x^2:) hoặc một số dạng hợp lý khác. Hoặc định dạng nhập trường / vòng cũng có thể khác nhau.

Đầu ra

Chương trình / hàm của bạn sẽ xuất ra đa thức bao thanh toán. Bạn có thể để lại nhiều gốc mở rộng (tức là (x + 1)(x + 1)thay vì (x + 1)^2). Bạn có thể xóa khoảng trắng giữa các toán tử nhị phân. Bạn có thể thay thế vị trí kề nhau bằng *. Bạn có thể chèn khoảng trắng vào những nơi kỳ lạ. Bạn có thể sắp xếp lại các yếu tố theo bất kỳ thứ tự nào bạn muốn. Các xthuật ngữ chỉ có thể được (x). xcó thể được viết là x^1; tuy nhiên thuật ngữ không đổi có thể khôngx^0. Không liên quan +dấu hiệu cho phép. Bạn có thể không có một điều khoản với một 0ở phía trước, họ phải bị bỏ lại. Thuật ngữ hàng đầu của mỗi yếu tố phải là tích cực, dấu hiệu tiêu cực phải ở bên ngoài.

Các trường hợp thử nghiệm, chương trình của bạn sẽ có thể tạo đầu ra cho từng trường hợp này trong thời gian hợp lý (giả sử <= 2 giờ):

Đầu vào: 2, x^3 + x^2 + x + 1

Đầu ra: (x + 1)^3

Đầu vào: 0, x^3 + x^2 + x + 1

Đầu ra: (x + 1)(x^2 + 1)

Đầu vào: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30

Đầu ra: (3x + 2)(2x - 5)(x^2 + 3)

Đầu vào: 5, x^4 + 4x^3 + 4x^2 + x

Đầu ra: x(x + 4)(x + 4)(x + 1)

Đầu vào: 0, x^5 + 5x^3 + x^2 + 4x + 1

Đầu ra: (x^3 + 4x + 1)(x^2 + 1)

Đặc biệt cảm ơn Peter Taylor đã phê bình các trường hợp thử nghiệm của tôi


1
Tôi nghĩ rằng điều này sẽ cho tôi một hồi tưởng về một số môn toán đại học khó hơn . Tôi thậm chí đang đi đúng hướng ở đây?
Chấn thương kỹ thuật số

1
Điều này khiến tôi nhớ lại thời gian tôi gặp ác mộng khi cố gắng in đa thức một cách chính xác ...
Sp3000

Xin lỗi mà tôi không hiểu, nhưng số đầu vào đầu tiên phải làm là gì? hoặc nó ảnh hưởng đến đầu ra như thế nào?
Trình tối ưu hóa

@Optimizer Số đầu vào đầu tiên xác định trường / số nguyên bạn đang làm việc. Nếu số không khác, bạn đang làm việc trên trường hữu hạn của đơn hàng đó. Một trường hữu hạn của trật tự pcó các phần tử {0, 1, ... , p-1}và nó nằm dưới mod cộng / nhân p. Về cơ bản, giảm bất kỳ hệ số nào bằng mod pvà bạn vẫn ổn. Ngoài ra, lưu ý rằng nếu nó có gốc, tức là yếu tố tuyến tính, một trong số đó {0, ... , p-1}sẽ tạo ra 0(mod p) khi nó được cắm vào đa thức.
Justin

1
@flawr, cách tiếp cận tiêu chuẩn để bao thanh toán Zlà yếu tố Z/pZcho một pthang máy Hensel phù hợp và sau đó. Tuy nhiên, cách tiếp cận có thể chơi gôn có lẽ (và đây chắc chắn là con đường tôi đang tìm kiếm) để sử dụng một ràng buộc đơn giản về chiều cao của các yếu tố và vũ lực.
Peter Taylor

Câu trả lời:


17

GolfScript (222 byte)

~.@:q@.0\{abs+}/2@,2/)?*or:^{\1$^base{^q- 2/-}%.0=1=1$0=q>+{{:D[1$.,2$,-)0:e;{.0=0D=%e|:e;(D(@\/:x@@[{x*~)}%\]zip{{+}*q!!{q%}*}%}*e+])0-{;0}{@;@\D.}if}do}*;\).^3$,)2/?<}do;][[1]]-{'('\.,:x;{.`'+'\+'x^'x(:x+x!!*+\!!*}%')'}/

Bản demo trực tuyến

Ghi chú

  1. Định dạng đầu vào được ntheo sau bởi một hệ số GolfScript từ hầu hết đến ít quan trọng nhất. Ví dụ 0, x^5 + 5x^3 + x^2 + 4x + 1nên được định dạng là 0 [1 0 5 1 4 1].
  2. Trong một lĩnh vực hữu hạn, chỉ có nhiều đa thức có mức độ đủ nhỏ để có liên quan. Tuy nhiên, đây không phải là trường hợp hơn Z. Tôi xử lý Zbằng cách sử dụng một hình thức thoải mái về chiều cao bị ràng buộc của Mignotte. Một bài báo tuyệt vời về giới hạn chiều cao trong bao thanh toán là Bound on Factors in Z [x] , John Abbott, 2009 (liên kết là bản in lại của arxiv; CV của ông nói rằng nó đã được Tạp chí Tính toán tượng trưng chấp nhận ). Hình thức thoải mái nhất được đưa ra là về mặt định mức L-2, nhưng để lưu byte tôi thư giãn hơn nữa và sử dụng định mức L-1 thay thế. Sau đó, đó là một trường hợp vũ phu buộc phải phân chia thử nghiệm.
  3. Trong một trường hữu hạn, mọi đa thức là một hằng số đa thức monic, vì vậy tôi chỉ thực hiện phép chia theo đa thức monic và lưu một đối ứng trong trường. Tuy nhiên, Zchỉ là một chiếc nhẫn và do đó, cần phải thực hiện phân chia thử nghiệm bởi các yếu tố ứng cử viên không phải là monic. Tôi quản lý để thoát khỏi việc không thực hiện các số hữu tỷ bằng cách thực hiện kiểm tra phân chia nhân tố hàng đầu và tích lũy cờ "lỗi" e.
  4. Cả hai điểm 2 và 3 đều ngụ ý rằng trường hợp bao thanh toán Znói chung chậm hơn và không thể được kiểm tra bằng bản demo trực tuyến. Tuy nhiên, chậm nhất trong các trường hợp thử nghiệm chính thức mất 10 phút, cũng nằm trong giới hạn thời gian "hợp lý".
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.