Các chiến lược biểu diễn một số nguyên lớn nhất định bằng biểu thức số học


13

Tôi có một con số cụ thể trong đầu, nhưng đó là một phần của thử thách tôi đang làm và tôi không muốn mọi người thực hiện (tất cả) công việc cho tôi.

Đây là một số có cùng chữ số, nhưng được xáo trộn:

5713167915926167134578399473447223554460066674314639815391281352328315313091488448321843
8892917486601064146636679920143691047671721184150386045081532202458651561779976236919751
5521854951599379666116678853267398393892536121049731949764192014193648608210652358947001
6332620900065461061195026191178967128001712341637591690941978871368243245270800684616029
6679555942849366434586090627998161441134473428845367022486230724219981658438108844675033
4461550796750244527407413996606134735852639191026103378962082622204359677030054592798927
4145951979523473408718011778751084514127053772614511042703365596651912104541233491744530
87457854312602843967491787086250478422477028164189

Số có 666 chữ số (thập phân). Bởi vì tôi đang sử dụng Python, các số nguyên (hoặc kỹ thuật dài) sẽ tự động là bignums.

Tôi có 255 ký tự để sử dụng và tôi cần mô tả cùng một số. Mô tả có nghĩa là được chạy qua eval () để tạo số gốc.

Những chiến lược nào tôi nên xem xét?


mã hóa base64 (hoặc cao hơn)
Luis Mendo

2
Bạn có chắc chắn rằng con số thực tế từ thử thách của bạn không có một số thuộc tính giúp nén dễ dàng hơn có thể bị mất do chia sẻ lại không? Tôi không nghĩ những lời đề nghị của Luis sẽ cắt nó. Ngay cả trong cơ sở 256, điều này vẫn có 277 chữ số. Tất nhiên, bạn nói rằng bạn đã có "255 ký tự", vì vậy tôi đoán về nguyên tắc bạn có thể sử dụng một cơ sở lớn hơn nhiều như 2 ^ 16 và đi vào Unicode.
Martin Ender

4
Đây là yêu cầu mã ngắn nhất để tạo ra một số, đó là hoàn toàn yêu cầu tư vấn chơi golf. Mối quan tâm của tôi là nguồn không được xác nhận - thách thức nên được liên kết nếu có thể để chúng tôi có quyền và có thể kiểm tra xem có ổn không khi đưa ra trợ giúp bên ngoài.
xnor

Tôi có 255 ký tự để sử dụng và tôi cần mô tả cùng một số. Mô tả có nghĩa là được chạy qua eval () để tạo số gốc : bạn có thể chấp nhận đọc số từ một tài nguyên bên ngoài, chẳng hạn như một trang web không?
Luis Mendo

@LuisMendo Không, nó phải được khép kín. Ngoài ra, nó chỉ có thể sử dụng ký tự hợp pháp trong tên tệp.
Christian Sonne

Câu trả lời:


12

Mã hóa cơ sở

Một kỹ thuật tiêu chuẩn để nén số là thể hiện chúng trong một cơ sở lớn và mã hóa các chữ số dưới dạng ký tự. Ví dụ: nếu bạn mã hóa số trong cơ sở 256, nó sẽ chỉ có 277 chữ số:

[12 24 156 48 101 149 235 32 96 92 20 203 202 164 144 71 193 127 112 77 141 79 210 183 98 155 16 151 65 198 26 236 83 221 220 129 169 254 43 124 245 25 176 182 167 124 95 191 77 25 233 139 190 7 135 2 149 90 163 163 106 193 220 253 109 129 57 219 91 157 218 18 223 11 171 113 209 173 207 123 110 220 79 139 176 143 171 7 30 35 231 151 172 83 120 114 119 47 217 227 50 105 236 91 161 226 112 16 170 57 162 147 36 89 26 9 122 164 15 15 243 108 30 14 233 139 103 137 82 169 2 57 54 71 154 136 23 203 137 10 219 153 24 168 42 218 165 125 185 183 241 91 193 85 195 71 186 18 98 34 196 78 6 193 252 8 177 94 5 24 137 183 127 129 9 77 149 73 148 193 62 220 146 33 130 21 209 153 229 105 100 188 87 235 203 104 207 161 20 17 102 150 252 120 242 222 233 248 114 217 142 31 196 42 161 173 0 244 9 213 178 152 122 170 136 230 135 132 245 69 9 196 231 147 8 175 48 98 101 23 162 144 190 200 62 226 61 27 200 15 232 12 105 187 184 4 121 252 171 240 230 94 161 151 131 209 205 130 193 9 4 155 92 48 59 130 93]

Hoặc thể hiện dưới dạng một chuỗi

"0eë `\ËʤGÁpMOÒ·bAÆìSÝÜ©þ+|õ°¶§|_¿Mé¾Z££jÁÜým9Û[Úß«qÑ­Ï{nÜO°«#ç¬Sxrw/Ùã2iì[¡âpª9¢$Y  z¤ólégR©96GË
Û¨*Ú¥}¹·ñ[ÁUÃGºb\"ÄNÁü±^· MIÁ>Ü!Ñåid¼WëËhÏ¡füxòÞéørÙÄ*¡­ô  Õ²zªæõE Äç¯0be¢¾È>â=Èèi»¸yü«ðæ^¡ÑÍÁ  \0;]"

(Cộng với một số ký tự không thể in được bị tước bởi SE.)

Tất nhiên, điều đó vẫn còn quá dài cho khoản trợ cấp 255 ký tự của bạn. Nếu bạn thực sự đang nói về các ký tự (trái ngược với byte), bạn có thể chuyển sang Unicode và sử dụng cơ sở lớn hơn nhiều. Làm thế nào về 2 16 ? Đó chỉ là 139 chữ số:

[12 6300 12389 38379 8288 23572 52170 42128 18369 32624 19853 20434 46946 39696 38721 50714 60499 56796 33193 65067 31989 6576 46759 31839 48973 6633 35774 1927 661 23203 41834 49628 64877 33081 56155 40410 4831 2987 29137 44495 31598 56399 35760 36779 1822 9191 38828 21368 29303 12249 58162 27116 23457 57968 4266 14754 37668 22810 2426 41999 4083 27678 3817 35687 35154 43266 14646 18330 34839 52105 2779 39192 43050 55973 32185 47089 23489 21955 18362 4706 8900 19974 49660 2225 24069 6281 46975 33033 19861 18836 49470 56466 8578 5585 39397 26980 48215 60363 26831 41236 4454 38652 30962 57065 63602 55694 8132 10913 44288 62473 54706 39034 43656 59015 34037 17673 50407 37640 44848 25189 6050 37054 51262 57917 7112 4072 3177 48056 1145 64683 61670 24225 38787 53709 33473 2308 39772 12347 33373]

(Tôi không thể bao gồm chuỗi thực tế ở đây, vì nó chứa một số ký tự CJK bị SE cấm.)

Bây giờ điều đó dường như có thể làm được nhiều hơn. Bạn chỉ cần có thể giải mã nó trong 116 ký tự. Nếu bạn không thể, Unicode có nhiều hơn 2 16 ký tự, vì vậy bạn có thể thử sử dụng một cơ sở thậm chí còn lớn hơn.


2
"Nhân vật CJK bị SE cấm" - wtf?
dùng253751


1
Cơ sở 2²⁰ mô tả số chỉ có 145 ký tự .
Dennis

4

Nguyên tố

Nếu số không có tính năng thú vị, mã hóa cơ sở là cách tốt nhất để làm điều đó. Điều tiếp theo cần làm là tìm kiếm các tính năng thú vị của số. Điều đầu tiên xuất hiện trong đầu là nó có thể có các yếu tố của các số nguyên tố nhỏ (2,3,5,7, v.v.) được nâng lên thành các quyền lực khá lớn. NẾU bạn không có gì khác để tiếp tục, hãy tiếp tục cố gắng phân chia theo các số nguyên tố nhỏ và xem điều gì sẽ xảy ra. Nếu các yếu tố của nó bao gồm 2**4, 3**47**4, bạn có thể viết big number *42**4ngắn hơn vài byte so vớibig number * 3111696


4
Tôi cũng sẽ thử bao gồm số cộng hoặc trừ các số nguyên nhỏ để xem liệu một trong số chúng có hệ số đẹp hơn không. Ngoài ra, nếu ngôn ngữ của bạn có một cách ngắn để lấy số nnguyên tố thứ, bạn có thể lưu một chữ số hoặc hơn mỗi số nguyên tố bằng cách lưu trữ chỉ mục của nó thay vì chính số nguyên tố đó.
2012rcampion

4

Loại bỏ đệ quy hình vuông lớn nhất

Cách tiếp cận này loại bỏ số vuông lớn nhất từ ​​N, lặp đi lặp lại, cho đến khi không có giá trị tiếp tục.

while(n>999*999):
    s = sqrt(n,2)
    print s,"** 2 +"
    n = n - s**2
print n

Nếu bạn bỏ qua các ký tự "** 2 +", thì ký tự này sẽ xuất hiện gần bằng số chữ số với số gốc. Việc bù cho 4 ký tự phụ đó mỗi lần lặp lại đòi hỏi một chút may mắn. Trong trường hợp số của bạn, kết quả có 670 chữ số của số vuông, cộng với 7x "** 2+", một thất bại khác:

755855006990505232214298076833020140623897728341856142793250050184099570268569900389346192358073922001480310798643405893673501405667458785677166605919485512157948819102093414848159820683798554799982163455753292781944741934237780592730586508786425528910736750640071037094033497266578109597923654387813828207885510302579581252831537751**2+
33300095205899066129442737321270515378501483166974896029394675779096351509514355500527819871697116193238261137790928953798777695127752032484956608505929119246433389165**2+
187763197402063683206154659623192450644818397963460986292088297442441704645626089130**2+
278760215056365252005927060531480627653626**2+
639191600506542558482**2+
25777519523**2+
106673**2+
103405

Bằng cách gần như hòa vốn trung bình, thuật toán này cho vay rất tốt để được sử dụng kết hợp với các thuật toán khác (hoặc thậm chí chính nó) để tiếp tục giảm các số trong biểu thức (với chi phí của một số dấu ngoặc đơn). Những thuật toán khác có thể đắt hơn, vì chúng sẽ hoạt động với số lượng nhỏ hơn đáng kể so với ban đầu. Trong ví dụ đã cho, lợi ích ròng có thể đạt được nếu một thuật toán hiệu quả và đắt tiền hơn có thể cắt giảm 25% các ký tự của 33300095205899066129442737321270515378501483166974896029394675779096351509514355500527819871697116193238261137790928953798777695127752032484956608505929119246433389165(giá trị lớn thứ hai trong kết quả)


Cách tiếp cận này có thể được cải thiện một chút bằng cách kiểm tra các hình khối, và rất hiếm khi sức mạnh thứ tư là tốt.
Sparr

0

Sức mạnh lớn gần đó

Cách tiếp cận này tìm kiếm [tương đối] số lượng nhỏ được nâng lên một số sức mạnh gần với số mục tiêu. Trong hầu hết các trường hợp, việc khôi phục N là A ** B + C sẽ không phải là một sự cải thiện, nhưng trong một số trường hợp sẽ như vậy.

def nearest_power(n):
    mindiff = 1
    best = (n,1)
    for a in xrange(2,10000):
        b = math.log(n,a)
        if math.ceil(b)-b<mindiff:
            mindiff = math.ceil(b)-b
            print a,"**",b
            best = (a,b)
        if b-math.floor(b)<mindiff:
            mindiff = b-math.floor(b)
            print a,"**",b
            best = (a,b)
    return best

10000là một hằng số tùy ý. Điều kiện bảo lãnh cũng có thể dựa trên một số mục tiêu mindiff.

Trong trường hợp số mẫu N của bạn có 666 chữ số, hàm này (với giới hạn 10k tăng thêm một chút) thấy rằng N ~= 165661162**81.0000000025, N-165661162**81số 659 chữ số, cắt 7 chữ số để xử lý với chi phí 14 ký tự biểu thức , một thất bạ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.