PRNG có thể được sử dụng để nén công cụ một cách kỳ diệu?


38

Ý tưởng này xảy ra với tôi khi còn bé học lập trình và lần đầu tiên gặp PRNG. Tôi vẫn không biết nó thực tế như thế nào, nhưng bây giờ có trao đổi ngăn xếp.

Đây là sơ đồ của một đứa trẻ 14 tuổi cho một thuật toán nén tuyệt vời:

Lấy một PRNG và gieo nó bằng hạt giống sđể có được một chuỗi dài các byte giả ngẫu nhiên. Để truyền chuỗi đó cho một bên khác, bạn chỉ cần truyền đạt một mô tả về PRNG, hạt giống thích hợp và độ dài của tin nhắn. Đối với một chuỗi đủ dài, mô tả đó sẽ ngắn hơn nhiều so với chính chuỗi đó.

Bây giờ giả sử tôi có thể đảo ngược quá trình. Có đủ thời gian và tài nguyên tính toán, tôi có thể thực hiện tìm kiếm vũ phu và tìm hạt giống (và PRNG, hay nói cách khác: một chương trình) tạo ra chuỗi mong muốn của tôi (Giả sử một bức ảnh thú vị về những chú mèo tinh nghịch).

Các PRNG lặp lại sau khi đã tạo ra một số lượng bit đủ lớn, nhưng so với các chu kỳ "thông thường" thì thông điệp của tôi khá ngắn nên điều này dường như không có vấn đề gì.

Voila, một cách hiệu quả (nếu rube-Goldbergian) để nén dữ liệu.

Vì vậy, giả sử:

  • Trình tự tôi muốn nén là hữu hạn và được biết trước.
  • Tôi không thiếu tiền mặt hoặc thời gian (Chỉ cần một lượng hữu hạn của cả hai)

Tôi muốn biết:

  • Có một lỗ hổng cơ bản trong lý luận đằng sau kế hoạch này?
  • Cách tiêu chuẩn để phân tích các loại thí nghiệm suy nghĩ này là gì?

Tóm lược

Đó thường là trường hợp câu trả lời tốt làm rõ không chỉ câu trả lời, mà đó là điều tôi thực sự hỏi. Cảm ơn sự kiên nhẫn và câu trả lời chi tiết của mọi người.

Đây là nỗ lực thứ n của tôi trong phần tóm tắt các câu trả lời:

  • Góc PRNG / hạt giống không đóng góp gì cả, nó không khác gì một chương trình tạo ra chuỗi mong muốn làm đầu ra.
  • Nguyên tắc pigeonhole: Có nhiều thông điệp có độ dài> k hơn so với các chương trình (tạo tin nhắn) có độ dài <= k. Vì vậy, một số chuỗi đơn giản không thể là đầu ra của một chương trình ngắn hơn thông báo.
  • Điều đáng nói là trình thông dịch của chương trình (tin nhắn) nhất thiết phải được sửa trước. Và thiết kế của nó xác định tập hợp con (nhỏ) của các tin nhắn có thể được tạo khi nhận được tin nhắn có độ dài k.

Tại thời điểm này, ý tưởng PRNG ban đầu đã chết, nhưng có ít nhất một câu hỏi cuối cùng để giải quyết:

  • H: Tôi có thể gặp may mắn và thấy rằng tin nhắn dài (nhưng hữu hạn) của tôi chỉ là đầu ra của một chương trình có độ dài <k bit?

Nói đúng ra, đó không phải là vấn đề may rủi vì ý nghĩa của mọi thông điệp (chương trình) có thể phải được biết trước. Đó ý nghĩa của một số thông điệp của <k bit hoặc không .

Nếu tôi chọn một tin nhắn ngẫu nhiên> = k bit một cách ngẫu nhiên (tại sao tôi lại như vậy?), Trong mọi trường hợp tôi sẽ có xác suất biến mất khi có thể gửi nó bằng cách sử dụng ít hơn k bit và gần như chắc chắn không thể gửi nó hoàn toàn sử dụng ít hơn k bit.

OTOH, nếu tôi chọn một thông báo cụ thể> = k bit từ những bit là đầu ra của chương trình có ít hơn k bit (giả sử có một thông báo như vậy), thì thực tế tôi đang tận dụng các bit đã được truyền đến người nhận (thiết kế của trình thông dịch), được tính là một phần của thông điệp được chuyển.

Cuối cùng:

Cuối cùng, cả hai đều nói với chúng ta điều tương tự như nguyên tắc pigeonhole (đơn giản hơn) cho chúng ta biết về mức độ chúng ta có thể nén: có lẽ không phải, có lẽ một số, nhưng chắc chắn không nhiều như chúng ta ưa thích (trừ khi chúng ta gian lận).


6
Tinh chỉnh câu hỏi của bạn một chút và bạn vẫn không thể nén mọi chuỗi (như được mô tả trong các câu trả lời bên dưới), nhưng bạn có được Lý thuyết thông tin thuật toán ( en.wikipedia.org/wiki/Kolmogorov_complexity ). Thay thế "PRNG" bằng "máy Turing phổ dụng" và "hạt giống" bằng "băng đầu vào có chứa chương trình tạo đầu ra mà tôi muốn." Hầu hết các băng đầu vào dài hơn đầu ra mà chúng tạo ra, nhưng đối với mỗi đầu ra tồn tại ít nhất một đầu vào tạo ra đầu ra đó.
Logic lang thang

Không, nhưng kích thước nén là entropy của nguồn ^ _ ^
Navin

5
Nếu bạn thực sự thực hiện điều này, bạn sẽ tìm thấy một điều thú vị: để xây dựng lại đầu vào tùy ý, bạn sẽ cần một hạt giống + rng, trung bình, mỗi bit lớn như dữ liệu gốc. Rất tiếc.
Đánh dấu

Một cách khác để hiểu lý do tại sao điều này sẽ không hoạt động: mặc dù PRNG có thể tạo đầu ra dài tùy ý , nó không thể tạo đầu ra tùy ý . (Đầu ra của PRNG sẽ luôn là một số chu kỳ hoặc mẫu cố định, bị ràng buộc bởi kích thước của trạng thái của nó.)
Pi Delport

@PietDelport, Đối với bất kỳ n nào cũng có PRNG có chu kỳ lớn hơn nhiều và câu hỏi được đặt ra đã được biết trước. Vì vậy, tôi không tin rằng thực tế là các PRNG tự chu kỳ trực tiếp giải quyết câu hỏi.

Câu trả lời:


43

Bạn đã có một chương trình nén mới tuyệt vời, eh? Alrighty sau đó...

Tất cả hãy chơi, trò chơi entropy

Để đơn giản, tôi sẽ giả sử bạn muốn nén các tin nhắn có chính xác bit, đối với một số n cố định . Tuy nhiên, bạn muốn có thể sử dụng nó cho các tin nhắn dài hơn, vì vậy bạn cần một số cách phân biệt tin nhắn đầu tiên của bạn với tin nhắn thứ hai (không thể mơ hồ những gì bạn đã nén).nn

Vì vậy, kế hoạch của bạn là xác định một số họ PRNG / hạt sao cho nếu bạn muốn nén, giả sử, , sau đó bạn chỉ cần viết một số số k , xác định một số tổ hợp hạt giống / PRNG được tính toán trước (và chia sẻ) tạo ra các bit đó sau n truy vấn. Ổn thỏa. Có bao nhiêu chuỗi bit khác nhau có độ dài n ? 2 n (bạn có n lựa chọn giữa hai mục; 01 ). Điều đó có nghĩa là bạn sẽ phải tính 2 n trong số các combo này. Không vấn đề gì. Tuy nhiên, bạn cần phải viết ra k trong nhị phân để tôi đọc nó. Làm thế nào lớn k có thể nhận được? Chà, nó có thể lớn bằng 201000111001knn2n012nkk . Tôi cần bao nhiêu bit để viết ra 2 n ? log 2 n = n .2n2nlog2n=n

Rất tiếc! Lược đồ nén của bạn cần thông báo miễn là những gì bạn đang nén!

"Haha!", Bạn nói, "nhưng đó là trường hợp xấu nhất! Một trong những tin nhắn của tôi sẽ được ánh xạ thành , chỉ cần 1 bit để thể hiện! Chiến thắng!"01

Có, nhưng tin nhắn của bạn phải rõ ràng! Làm thế nào tôi có thể phân biệt theo sau 0 từ 10 ? Vì một số khóa của bạn có độ dài n , tất cả chúng đều phải hoặc nếu không tôi không thể biết bạn đã bắt đầu và dừng ở đâu.1010n

"Haha!", Bạn nói, "nhưng tôi chỉ có thể đặt độ dài của chuỗi thành nhị phân trước! Điều đó chỉ cần đếm đến , có thể được biểu thị bằng các bit log n ! Vì vậy, số 0 của tôi bây giờ có tiền tố chỉ bằng log n bit, tôi vẫn thắng! "nlogn0logn

Có, nhưng bây giờ những con số thực sự lớn đó có tiền tố là các bit . Đề án nén của bạn đã làm cho một số tin nhắn của bạn thậm chí lâu hơn! Và một nửa số của bạn bắt đầu bằng 1 , vì vậy một nửa số tin nhắn của bạn dài hơn nhiều!logn1

Sau đó, bạn tiến hành đưa ra nhiều ý tưởng như ký tự kết thúc, gz số và tự nén độ dài, nhưng tất cả những ý tưởng đó đều chạy vào trường hợp thông điệp kết quả chỉ dài hơn. Trong thực tế, với mỗi bit bạn lưu trên một số tin nhắn, một tin nhắn khác sẽ nhận được phản hồi lâu hơn. Nói chung, bạn sẽ thay đổi "chi phí" của tin nhắn. Làm một số ngắn hơn sẽ chỉ làm cho những người khác dài hơn. Bạn thực sự không thể phù hợp với tin nhắn khác nhau trong ít không gian hơn là viết ra 2 n chuỗi nhị phân có độ dài n .2n2nn

"Haha!", Bạn nói, "nhưng tôi có thể chọn một số tin nhắn là 'ngu ngốc' và biến chúng thành bất hợp pháp! Sau đó, tôi không cần phải đếm hết đến , vì tôi không hỗ trợ nhiều tin nhắn đó!"2n

Bạn đúng, nhưng bạn chưa thực sự chiến thắng. Bạn vừa thu nhỏ bộ tin nhắn bạn hỗ trợ. Nếu bạn chỉ hỗ trợ b = 111111110101000 như các tin nhắn bạn gửi, thì bạn chắc chắn có thể có mã a 0 , b 1 , khớp chính xác với những gì tôi đã nói. Ở đây, n = 1 . Độ dài thực tế của tin nhắn không quan trọng, có bao nhiêu.a=0000000011010b=111111110101000a0b1n=1

"Haha!", Bạn nói, "nhưng tôi có thể đơn giản xác định rằng những tin nhắn ngu ngốc đó rất hiếm! Tôi sẽ biến những thứ hiếm hoi thành lớn, và những cái chung nhỏ thành nhỏ! Sau đó, tôi sẽ thắng trung bình!"

Vâng! Xin chúc mừng, bạn vừa phát hiện ra entropy ! Nếu bạn có bài viết, nơi i th nhắn có xác suất p i bị gửi, sau đó bạn có thể nhận được độ dài tin nhắn mong đợi của bạn xuống đến entropy H = Σ n i = 1 p i log ( 1 / p i ) của bộ này của tin nhắn. Đó là một loại biểu hiện kỳ ​​lạ, nhưng tất cả những gì bạn thực sự cần biết là nó lớn nhất khi tất cả các tin nhắn đều có khả năng như nhau và nhỏ hơn khi một số phổ biến hơn các tin nhắn khác. Trong cực đoan, nếu bạn biết về cơ bản mọi thông điệp sẽ là mộtnipiH=i=1npilog(1/pi) . Sau đó, bạn có thể sử dụng mã siêu hiệu quả này: a 0 , x 1 x nếu không. Sau đó, chiều dài thông điệp dự kiến của bạn về cơ bản là 1 , đó là tuyệt vời, và điều đó sẽ được thực sự gần với entropy H . Tuy nhiên, H là một giới hạn thấp hơn và bạn thực sự không thể đánh bại nó, cho dù bạn có cố gắng thế nào.a=000111010101a0x1x1HH

Bất cứ điều gì tuyên bố đánh bại entropy có lẽ không cung cấp đủ thông tin để lấy lại một cách rõ ràng thông điệp đã nén, hoặc chỉ sai. Entropy là một khái niệm mạnh mẽ đến mức chúng ta có thể giới hạn thấp hơn (và đôi khi cả hướng trên ) thời gian chạy của một số thuật toán với nó, bởi vì nếu chúng chạy rất nhanh (hoặc thực sự chậm), thì chúng phải làm gì đó vi phạm entropy .


13
Chàng trai, tôi có vẻ ngớ ngẩn khi bạn giả vờ là tôi. Cảm ơn chúa tôi có thể tự hào vì đã phát hiện ra entropy. Đùa sang một bên, đây là một câu trả lời tốt - Nếu chỉ có giai điệu không nhuốm màu nhạo báng.

6
Tôi không có ý định chế giễu, chỉ chơi theo ý tưởng "sơ đồ của một đứa trẻ 14 tuổi cho một thuật toán nén tuyệt vời". :)
Alexis Beingessner

3
Nghe cũng không giống tôi chế giễu :) Đây là một kế hoạch khá phổ biến để giải thích các vấn đề trong khoa học phổ biến (và một vài lĩnh vực khác), mặc dù đúng là "người hỏi" thường là Alice hoặc Bob chứ không phải là "thực" người: D Xem cách dễ dàng bạn có thể đột nhiên hiểu vấn đề thực sự phức tạp như thế nào! (không đề cập đến việc khi tôi nghĩ ra một vấn đề phức tạp trong đầu, tôi sử dụng quy trình tương tự - một cuộc đối thoại nội tâm rất tốt trong việc mô phỏng "nhiều người biết nhiều hơn")
Luaan

2
@SteveJessop, đó là một sự phân đôi giả và chúng ta đừng đến đó. Đó là một câu trả lời tốt và có lẽ tôi quá khổ, đó là điều đó.

3
@chipmonkey, tôi nghĩ điều đó vẫn được bao phủ bởi câu trả lời của alexis về "trò chơi entropy". Có thể, số lượng thuật toán cần thiết để làm điều đó sẽ rất lớn, số lượng bit cần thiết để xác định cái nào được sử dụng sẽ hủy bỏ lợi ích.

21

2N1N2NN

Trong cuộc sống thực, chúng ta thường biết một vài thứ về chuỗi chúng ta đang nén, nói đó là giọng nói hay hình ảnh. Trong trường hợp nén không mất dữ liệu, định lý mã hóa nguồn của Shannon cho thấy tốc độ nén tối ưu bằng với entropy của nguồn. Đối với mã hóa tổn thất, có các định lý khác trong lý thuyết thông tin (lý thuyết biến dạng tỷ lệ). Vì vậy, ngay cả trong trường hợp này cũng có giới hạn về số lượng bạn có thể nén dữ liệu.


Tôi chưa bao giờ nhìn nó theo cách này, nhưng điều này chỉ đến với tôi: về cơ bản, Shannon nói rằng ngay cả trường hợp tốt nhất cũng không thể được nén tùy ý và Nguyên tắc Pigeonhole đảm bảo rằng phải có trường hợp xấu nhất không thể nén được ở tất cả. Đó có phải là một đặc tính hợp lý?
Jörg W Mittag

1
Trường hợp tốt nhất luôn có thể được nén, vì bạn có thể bao gồm một số chuỗi như một trường hợp đặc biệt của thuật toán nén của bạn. Đối số này hoạt động không chỉ cho trường hợp xấu nhất mà còn cho trường hợp trung bình, cho thấy mức nén trung bình tối đa là 2 bit.
Yuval Filmus

À, tất nhiên rồi. if input.empty? then output_very_long_stringsẽ cho một tỷ lệ nén vô hạn là trường hợp tốt nhất. Trên thực tế, thậm chí còn có một thuật toán nén sử dụng điều này. (Tôi quên tên, không may.) Nó được thiết kế cho các chuỗi rất ngắn, và nó có mã hóa đặc biệt dành cho chuỗi con mã hóa cứng như http://, www., .comvà vân vân.
Jörg W Mittag

Tôi có thể đánh bại đối số này nếu tôi có cách thiết kế một họ PRNG sao cho các chuỗi họ không thể diễn đạt là những thứ tôi loại trừ trước không? (lò xo định hình tiếng ồn để tâm).

3
H= =Σtôiptôitôiog1/ptôiptôiH

7

Sk2kn2nnS

(Như một câu trả lời khác đã lưu ý, điều này sẽ xảy ra đối với bất kỳ chức năng nén nào bạn chọn.)


Bản thân nó không chứng minh được rằng tôi không thể tạo ra một PRNG chỉ xảy ra để tạo ra chuỗi đã chọn của tôi như là một trong những đầu ra có thể, trong khi yêu cầu ít bit hơn để làm như vậy. Theo tôi hiểu từ các câu trả lời khác, entropy có thể thực thi một giới hạn thấp hơn về số lượng bit cần thiết. Đó là, tôi chỉ đơn giản là không thể làm tốt tùy ý cho chuỗi đã chọn của mình.

Tất cả điều này nói rằng nếu bạn tạo ra PRNG yêu thích của bạn, thì tôi có thể đến với bạn với một chuỗi mà nó không tạo ra, điều này đã phá vỡ ý tưởng của bạn. Một tuyên bố mạnh mẽ hơn là có những chuỗi không được phát ra bởi bất kỳ chương trình ngắn hơn nhiều. (Nói cách khác, bạn vẫn thua ngay cả khi tôi cho phép bạn thay đổi chức năng của mình sau khi xem trình tự của tôi. Đó là những gì Yuval ám chỉ với "độ phức tạp Kolmogorov".)
Louis

4

Bên cạnh các điểm đã trả lời khác, tôi chỉ muốn thêm liên kết này: https://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

Bây giờ, sản lượng năng lượng hàng năm của mặt trời của chúng ta là khoảng 1,21 × 10 ^ 41 erg. Điều này đủ để cung cấp năng lượng cho khoảng 2,7 × 10 ^ 56 thay đổi bit đơn trên máy tính lý tưởng của chúng tôi; đủ thay đổi trạng thái để đặt bộ đếm 187 bit qua tất cả các giá trị của nó. Nếu chúng ta chế tạo một quả cầu Dyson xung quanh mặt trời và thu được toàn bộ năng lượng của nó trong 32 năm, mà không mất bất kỳ tổn thất nào, chúng ta có thể cung cấp năng lượng cho một máy tính để đếm tới 2 ^ 192. Tất nhiên, nó sẽ không còn năng lượng để thực hiện bất kỳ tính toán hữu ích nào với bộ đếm này.

Vì vậy, chỉ lặp đi lặp lại (không so sánh ...) để tìm một chòm sao 187 bit hợp lệ của dữ liệu mong muốn của bạn sẽ có các điều kiện lý tưởng (không thể đạt được) nhiều năng lượng hơn mặt trời phát ra trong một năm.


1

Một bằng chứng rất nhanh rằng máy nén vạn năng không thể tồn tại. Giả sử, hãy giả sử bạn tạo một cái và bạn nén một đầu vào. Bây giờ, lặp đi lặp lại nén đầu ra của chương trình của bạn. Nếu bạn luôn có thể giảm kích thước, nó sẽ ngày càng nhỏ hơn trên mỗi bước, cho đến khi bạn giảm xuống 1 bit.

Bạn có thể lập luận rằng, có lẽ, đầu ra của thuật toán của bạn có cấu trúc như vậy mà nó không thể được nén nhiều hơn, nhưng sau đó bạn chỉ có thể áp dụng một shuffle xác định * trước khi giải nén.

Lưu ý: Một số xáo trộn xác định thực sự giúp ích trong một số sơ đồ nén: http://pytables.github.io/usersguide/optimization.html?highlight=shuffling#shufflingoptim


Tôi nghĩ rằng bạn đang thiếu rằng mỗi tin nhắn nén có một hạt giống sliên quan đến nó. Tin nhắn 01001011 với một ´s của 2348 sẽ khác với cùng một tin nhắn với một bảng dữ liệu của 3924. Trừ khi tôi tự hiểu nhầm thuật toán của foo1899 theo bất kỳ cách nào.
Azeirah

1

Việc sử dụng PRNG để "nén" về cơ bản là hữu ích trong một tình huống: khi cần sử dụng một bó dữ liệu "ngẫu nhiên" và ghi lại gọn gàng những dữ liệu nào được sử dụng. Hầu hết các trình tạo ngẫu nhiên giả chỉ có thể tạo ra một phần rất nhỏ các trình tự có thể, nhưng nếu chỉ cần một số trình tự "ngẫu nhiên" từ nhỏ đến vừa phải, thì phần trình tự có thể mà PRNG có thể tạo ra thường sẽ đủ hơn.

Nếu chuỗi dữ liệu mà một người muốn lưu trữ xảy ra ngẫu nhiên để khớp với những gì một PRNG nhất định sẽ tạo ra cho hạt giống phù hợp, thì việc lưu trữ hạt giống có thể là một cách thay thế nhỏ gọn để lưu trữ dữ liệu. Trừ khi nguồn dữ liệu là những trận đấu như vậy có khả năng xảy ra, tuy nhiên, chúng sẽ không thường xuyên đến mức việc tìm kiếm chúng sẽ không đáng giá.


PRNG được sử dụng theo cách này để biểu diễn dữ liệu ngẫu nhiên (giả), ví dụ vì mục đích lặp lại của các thí nghiệm.
Yuval Filmus

1
@YuvalFilmus: Chính xác. Chúng cũng có thể được sử dụng trong một số trường hợp như tạo cấp trò chơi video trong đó một phần nhỏ các cấp được tạo sẽ được coi là chấp nhận được, nhưng khi một nhà thiết kế trò chơi video có thể tạo ngẫu nhiên các cấp cho đến khi anh ta tìm thấy một số thứ theo ý thích của mình và ghi lại các hạt giống tạo ra những cái đó Một khái niệm rất hữu ích trong lịch sử, khi mã hóa cho một máy trò chơi video có 128 byte RAM, cố gắng điều chỉnh chương trình vào một hộp mực với 4096 byte ROM.
supercat

Đó là một ví dụ rất hay, nó phù hợp với sơ đồ mà tôi đã mô tả về việc tìm kiếm hạt giống "tốt", nhưng tận dụng thực tế là trong kịch bản đó, nhiều thông điệp có thể là tốt.

@ foo1899: Ngẫu nhiên, trò chơi "Cạm bẫy" vi.wikipedia.org/wiki/Pitfall ! đã sử dụng kỹ thuật nói trên để sử dụng tạo bản đồ 256 màn hình trên hộp mực trò chơi 4K trên máy có 128 byte RAM.
supercat

1

Một cái gì đó cần xem xét để thêm vào các câu trả lời khẳng định tại sao có một số chuỗi không thể nén do, theo định nghĩa, tính chất tiêm chích của giải nén và vũ trụ hạn chế của chuỗi được nén để chọn để thể hiện thông điệp là: hầu hết các chuỗi không thể được nén bởi vì có rất nhiều chuỗi entropy, rối loạn cao hơn so với các chuỗi có entropy và có cấu trúc thấp hơn, do đó làm phát sinh một điều kiện mà chúng ta thấy trong thực tế rằng: nén hầu hết thời gian là hữu ích, vì các thông điệp chúng ta hầu hết thường muốn nén là những người thường xuyên sở hữu một số thứ tự và cấu trúc, và theo ý kiến ​​này, là một phần của vũ trụ nhỏ hơn rất nhiều của các vật thể entropy thấp hơn. Điều này có nghĩa là có thể, bằng cách chọn độ dài đầu ra phù hợp, chúng ta có thể nén mọi thứ trong vũ trụ nhỏ hơn, có cấu trúc. Thuật ngữ có cấu trúc, entropy và được đặt hàng ở đây là không chính xác, để phản ánh các định nghĩa chủ quan về ngữ nghĩa và tính hữu dụng của các thông điệp mà chúng tôi có thể muốn nén.

Và trong câu trả lời trực tiếp cho yêu cầu của người hỏi: * vâng, tất nhiên bạn có thể gặp may mắn và thấy đầu ra của PRNG là thông điệp chính xác mà bạn muốn nén, chỉ là bạn thường không thấy đây là trường hợp vì chính đặc tính đặc trưng cho PRNG, cụ thể là khả năng tạo ra một chuỗi (gần như) vô tận của các chuỗi khác nhau, khiến nó không đồng thời tạo ra chuỗi của bạn.

Tất nhiên, bạn có thể giảm thiểu sự không có khả năng này bằng cách sử dụng PRNG để chuyển qua "biểu đồ miền" của chuyển đổi từ này sang từ khác và bạn tăng khả năng hiển thị tin nhắn của mình và giờ bạn cũng phải thêm biểu đồ miền vào tin nhắn được nén chiều dài.

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.