2011-12-17 26 views
6

Tôi có chuỗi 128 bit và người giám sát của tôi đã yêu cầu tôi trình bày 128 bit đó dưới dạng đa thức. Đây là một quét của giấy ông đang viết trên:Làm thế nào để sử dụng đa thức thay vì bit để cải thiện hiệu suất?

Converting bits to a polynomial

Ý tưởng của ông là, vì chúng ta đang loại bỏ sự 0s từ những bit, chúng ta sẽ có thể thực hiện các hoạt động tiếp theo (hầu hết trong số đó là XOR giữa các bit/đa thức) nhanh hơn nhiều nếu chúng ta làm việc trên tất cả các bit.

Tôi hiểu yêu cầu là gì và tôi có thể thực hiện trên giấy cũng như trong ứng dụng. Nhưng theo cách của tôi sẽ không đạt được mục tiêu của mình, đó là cải thiện hiệu suất. Anh ấy thực sự nói rằng có những thư viện đã làm điều này, nhưng tiếc là tôi không thể tìm thấy bất kỳ thư viện nào. Điều duy nhất tôi tìm thấy là một lớp Đa thức đánh giá đa thức, đó không phải là điều tôi muốn.

Các bạn có biết làm cách nào để triển khai tính năng này để cải thiện hiệu suất không? Bất kỳ mã/đoạn mã/bài viết nào được đánh giá rất nhiều.

Ứng dụng được viết bằng Java, nếu điều đó tạo ra bất kỳ sự khác biệt nào.

Cảm ơn,

Mota

Cập nhật:

giám sát của tôi nói rằng C library này sẽ làm nhiệm vụ. Tôi không thể tìm ra cách nó hoạt động như thế nào và nó sẽ làm như thế nào.

+0

Tôi đã thấy điều này được thực hiện trong các thư viện mã hóa, đặc biệt là các trường galois. Tôi không thể cụ thể hơn điều này, đã lâu rồi tôi mới thấy nó. –

+0

http://en.wikipedia.org/wiki/Finite_field_arithmetic –

+2

Vấn đề là hầu hết các bit xử lý máy rất nhanh và nếu bạn cố gắng làm bất cứ điều gì khác (.e.g *, +, /) nó vẫn phải sử dụng bit. Nếu sử dụng đa thức nhanh hơn trong mọi nguyên nhân, bạn có thể lấy giải pháp, chia thành bit và sau đó đa thức và làm cho nó nhanh hơn với mỗi lần lặp (thay vào đó tôi nghi ngờ nó sẽ chậm hơn mỗi lần). nhanh hơn, nhưng tôi không thể nghĩ ra được. –

Trả lời

7

Giám sát viên của bạn có quen thuộc với BitSet không? 128 bit là 16 byte, có thể được lưu trữ dưới dạng 2 longs. Tuy nhiên, bằng cách sử dụng một BitSet, bạn sẽ không cần phải lo lắng về việc đối phó với sự kết hợp của 2 longs. BitSet cũng cung cấp các phương thức cho tất cả các thao tác bit chung. Tôi nghĩ rằng bạn sẽ khá khó khăn để tìm một giải pháp tốt hơn thế này.

Cách tiếp cận đa thức là một ý tưởng khá hay, nhưng tôi nghĩ nó lý thuyết hơn thực tế.

6

Những gì anh ấy đề xuất là Monomial mà bạn có thể soạn thành Polynomial - hãy nghĩ mẫu Kết hợp. Xác định tất cả các hoạt động toán thông thường cho cả hai (cộng, trừ, nhân, chia) và bất kỳ người nào khác mà bạn nghĩ bạn có thể cần (ví dụ: phân biệt và tích hợp).

Đa thức sẽ thực sự tỏa sáng cho các trường hợp như x^1000 + 1, bởi vì bạn có thể chụp ảnh chỉ với hai cụm từ.

Câu hỏi thực sự là: Ông chủ của bạn tưởng tượng bạn đang tiết kiệm là gì? Một vài bit? Tốc độ? Thời gian phát triển? Tôi đồng ý với ziesemer - bạn sẽ khó có thể làm tốt hơn nhiều so với một số BitSet. Các khoản tiết kiệm của/anh ta nghĩ đến có vẻ như một tối ưu hóa vi mô cho tôi, loại điều sẽ không hiển thị nếu bạn đã lược tả ứng dụng của mình.

Nhưng anh/chị ông chủ ... có đáng để tranh cãi không?

Có thể bạn có thể trừu tượng hóa chi tiết này và lập hồ sơ cho cả hai.

1

Nếu bạn có nhiều chuỗi cần XOR, nó sẽ thực sự gây ra chi phí hoạt động. Điều này là bởi vì bạn cần phải phù hợp với trọng lượng.

Tất cả phụ thuộc vào những gì bạn đang XOR nhập vào và số lần bạn phải làm điều này để tính toán lợi thế để thực hiện phương pháp này.

Tôi sẽ đi với giải pháp của ziesemer.

1

Tôi nghi ngờ rất nhiều bạn sẽ nhận được bất kỳ lợi ích nào trên chuỗi 128 bit. 128 bit là 16 byte; bất kỳ đối tượng nào sẽ mất ít nhất 40, vì vậy (hầu hết) bất kỳ cấu trúc hỗ trợ nào sẽ đắt hơn so với dữ liệu mà nó lưu trữ.

Tuy nhiên, đây là a good survey các phương pháp hiện có — và một phương pháp mới, có thể (hoặc có thể không) có lợi cho bạn. Không phải như thể đó là câu trả lời cho câu hỏi của bạn, và đồng ý rằng giải pháp của ziesemer là tốt nhất cho những con số khổng lồ như vậy, nhưng nếu bạn muốn mở rộng tầm nhìn của mình, hãy xem.