Komprimering via primtalsfaktorisering?

Permalänk
Medlem

Komprimering via primtalsfaktorisering?

Jag har funderat på en sak de senaste dagarna, det driver mig till vansinne att inte få diskutera det med någon så jag tänkte höra vad ni tror om mitt resonemang.

Låt oss teoretiskt säga att det tar 0 tid att primtalsfaktorisera hur stora tal som helst (vilket jag vet är helt orimligt med dagens tekniker).

Om vi då representerar ett stycke data som ett enda stort decimalt tal (sätter ihop alla bitar och omvandlar till ett decimaltal) och skulle primtalsfaktorisera detta, och få det på formen 2^x*3^y... Skulle ju det faktoriserade datat bli otroligt litet i jämförelse med ursprungsdatat även om man får det värsta fallet där de flesta primtal upp till ~roten ur ursprungsdatat ingår (strängen blir alltså lång då de flesta exponenter är ett). En megabyte skulle ju bli bara ett par byte stort om man representerade det på ett vettigt sätt. en gigabyte yttligare ett antal bytes.

Låt oss säga att vi i framtiden kommer på ett sätt att få ner tiden för primtalsfaktorisering till små tidsenheter. Skulle en sådan komprimering då va möjlig? Eller är jag helt ute och cyklar? Kanske finns denna redan länka då gärna till lite info

Hoppas detta inte låg utanför forumets väggar, det handlar ju faktiskt om programmering ... nästan...

//Nicke

Visa signatur

Core 2 Quad Q6600 | Gigabyte GA-P35-DS3 | Corsair XMS2-6400 2x2048MB | Corsair HX 520W | BFG 8800GT

Permalänk

Utan att egentligen veta vad primtalsfaktorering handlar om eller vad su egentligen föreslår så kan jag med säkerhet säga: Du är totalt ute och cyklar. Du kan aldrig göra en komprimering som är effektiv oavsett indata. All komprimering bygger på att indatat har någon form av återupprepningar, förutsägbarhet, eller mönster.

Du kan altså aldrig göra en algoritm som komprimerar oavsett data. Om din ide skulle ha den egenskapen så kommer den inte hålla. Det är som när man har lyckats komma fram till en evighetsmaskin.När vi ndå är inne på ämnet kan jag också tipsa om att man aldrig kan slå odds som är emot en. Med andra ord så kan man aldrig långsiktigt vinna på roulette.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem

Jag kan en annan teknik. Division.
255/255 = 1
Från en byte till en bit. Det är ingen dålig kompression. Fast användaren måste komma ihåg att multiplicera med 255.

Permalänk
Medlem

Re: Komprimering via primtalsfaktorisering?

Citat:

Ursprungligen inskrivet av cochese
En megabyte skulle ju bli bara ett par byte stort om man representerade det på ett vettigt sätt. en gigabyte yttligare ett antal bytes.

Om man resonerade på detta sätt så skulle man ju kunna komprimera data rekursivt, dvs när du fått ihop en gigabyte med komprimerad data så är det ju bara att köra komprimeringen igen för att få det till ett antal bytes. Då skulle man kunna säga att all data som någonsin kommer finnas skulle kunna representeras med ett antal bytes, vilket är omöjligt.

Visst skulle man på något sätt kunna utnyttja primtalsfaktorisering till komprimering, men inte i närheten av sådana komprimeringsgrader.

En liknande sak var uppe i en tråd för ett tag sen, om att använda en slumptalsgenerator för att komprimera data och endast spara seeden:
http://forum.sweclockers.com/showthread.php?s=&threadid=49279...

Här är en bra sida där det står varför det inte fungerar:

http://www.dogma.net/markn/FAQ.html#Q19

Permalänk
Medlem

iXam: "Fast användaren måste komma ihåg att multiplicera med 255." Det jag har beskrivit delar ju upp datat så som du säger, och sparar 255 också.

madah: Tycker inte att det du skriver motbevisar att primtalsfaktorisering inte skulle fungera, dels så behövs ingen slump, och du säger att den skulle kunna köras gång på gång, det är inte sant då man inte kan primtalsfaktorisera ett tal flera gånger. man får samma resultat efter första gången. Mina komprimeringsgrader kanske inte stämmer, det har du säkert rätt i

Visa signatur

Core 2 Quad Q6600 | Gigabyte GA-P35-DS3 | Corsair XMS2-6400 2x2048MB | Corsair HX 520W | BFG 8800GT

Permalänk
Citat:

Ursprungligen inskrivet av iXam
Jag kan en annan teknik. Division.
255/255 = 1
Från en byte till en bit. Det är ingen dålig kompression. Fast användaren måste komma ihåg att multiplicera med 255.

Hur gör man med talet 231 då? 231/255=~0.9. Ska man då låta biten vara ettställd 90% av tiden och nollställd resten?
Eller ska man dividera med 231 så 231/231=1, då gäller det bara att komma ihåg att man diverade med 231 där..
Eller är det jag som är inte fattar vad du menar.. hehe
Eller betyder denna något..
*edit2*
Syftade du på ex att 1472 går att skriva som 46 *32? Men att bara spara talen 46=0b101110och 32=0b100000, tar mer plats än talet 1472=0b10111000000.

*edit*
cochese: Jag har också funderat lite smått om komprimering med hjälp av vanlig matematik. Men som problemet ser ut idag så det prestandan som är den mest kritisk vid våra datorer.

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk
Medlem

cochese: Du kan ju testa o köra din komprimeringsalgoritm på alla tal mellan 10 och 99, eller mellan 1000 och 1099, då borde du märka problemet själv tror jag.

Permalänk
Medlem

volatil komprimering: komprimerar valfri fil till några få bytes.
volatil dekomprimering: expanderar valfria komprimerade valfria filer till slumpmässig skräpfil. ge den tillräckligt många försök och du får tillbaks filen du komprimerade.

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av vb
cochese: Du kan ju testa o köra din komprimeringsalgoritm på alla tal mellan 10 och 99, eller mellan 1000 och 1099, då borde du märka problemet själv tror jag.

Jo, jag förstår ju att då tar det komprimerade upp mer plats än ursprungstalet. men om man har tillräckligt stora tal, och får många multiplar av samma primtal, tex 2 så borde man ju kunna komprimera det skitmycket. 2^30 * 3^11 = 190210142896128, där tex används 6 tal för att representera 15st. Vid otroligt stora tal borde komprimeringsgraden bli ännu högre.

Jag förstår ju att om man skulle ha otur och hitta ett jättestort primtal så skulle det ta upp massor av plats och knappt någon komprimering skulle ske.

Det kanske inte var så smart tänkt ändå men nu slipper jag fundera på det iaf

Visa signatur

Core 2 Quad Q6600 | Gigabyte GA-P35-DS3 | Corsair XMS2-6400 2x2048MB | Corsair HX 520W | BFG 8800GT

Permalänk
Medlem

Man kan ju komprimera det oändligt långa talet PI till:
pi = summan mellan i=0 oo ( 1/(16^i) * ( 4/(8i + 1) - 2/(8i + 4) - 1/(8i + 5) - 1/(8i + 6) )

(Bailey-Borwein-Plouffes algoritm)

Det kallar jag bra komprimering..

Visa signatur

96.0 ram minne systemresurser 9% ledigt filsystem 32 bitar virtuellt minne 32 bitar diskkompicerning inte installerad pccard (pcmia) det finns inga pcmica fack installerade systemet är konfugureat för optimal prestanda hårddisk c:/ 1837 mb ledigt hårddisk d:/ 688 mb ledigt

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Med andra ord så kan man aldrig långsiktigt vinna på roulette.

Kan man visst! Om man börjar satsa x på färgen röd och förlorar så dubblar man insatsen. Statistiskt sett så kommer röd någon gång att komma upp och då vinner du x. Detta sätt föresätter att man har en stor buffert.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Citat:

Ursprungligen inskrivet av Gräs-Mannen
Kan man visst! Om man börjar satsa x på färgen röd och förlorar så dubblar man insatsen. Statistiskt sett så kommer röd någon gång att komma upp och då vinner du x. Detta sätt föresätter att man har en stor buffert.

Om stor == oändlig så håller jag med, om det inte vore för 0 och 00 vill säga, observera också att man aldrig går i mer vinst än grundinsatsen:
1 :1
12 :3
124 :7
1248 :15
Säg att vi vinner på 16, då har du satsat totalt 15 och vunnit 16. 16-15=1.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem

Klart man kan vinna långsiktigt på roulette. Bara man har en otrolig tur. Naturligtvis är det förväntade värdet mindre än noll, men det innebär inte att man förlorar bara för att man spelar i oändligheten.

Visa signatur

Min hemsida: http://www.srekel.net
Pocket Task Force: http://ptf.srekel.net
Kaka e gott! http://kaka.srekel.net

Permalänk
Medlem

Informationsteorin säger att det är omöjligt. Och det är det.

Tänk på att varje ny bit du lägger till talet gör att det blir dubbelt så stort som föregående tal. Talen kommer bli så långa att när du faktoriserat dem kommer faktorerna att ta lika stort plats som det ursprungliga talet (och mer plats egentligen).

Du måste nämligen spara faktorerna i form av char eller int eller dylikt och de har fasta värden och tar alltid upp 1 eller 4 bytes vare sig du sparar talet 1 eller 43023.

Ta ett tal typ 16582 och primtalsfaktorisera det. Räkna sen antalet faktorer * 4 och se att du får oerhört mycket större storlek än ursprungstalet som tar 4 bytes. Det blir inte bättre av att talet är större heller.

Permalänk
Hedersmedlem

TechGuru, han hade en idé om att göra om det till decimal form först.
Alltså ta ett program fil på 1 MegaByte och tänker det som ett enda binärt tal, gör till decimal form och "trixar" med det där.
I decimal form blir ju talet från ungefär 2 till 90 gånger större om man lägger till en valfri siffra framför och det kan man väl utnyttja (kanske?).
Jag vill försvarar inte teorin men ville bara påpeka det som du missade tror jag.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Precis Aqualize, finns ju inget som säger att man måste hålla sig till ints, bytes mm. Jag kan lätt tänka ut ett talsystem som förutom en fast overhead ökar med 1 bit per tal. Blir såklart väldigt ineffektivt för små tal, men för stora så skulle det funka bra om det var bytes-representationen som var problemet.

cochese: Det lättaste sättet o se att det inte funkar är att tänka på hur den ska veta vilket tal den ska dekomprimera till. Låt säga att du har komprimerat en hög filer, där varje kombination av 10^100 1or o 0or är i var sin fil. Nu kommer själva problemet, nämligen att din komprimering gjort filerna lite mindre. Men hur har det gått till? Eftersom filerna är mindre så får inte alla kombinationer av 1or o 0or längre plats, vilket betyder att några av filerna nu ser identiska ut. Alltså skiter det sig

Ett litet exempel på alla kombinationer för 2 bitar:
11
01
10
00

Det går inte o spara alla kombinationerna med mindre än 2 bitar, eftersom det bara finns 2 olika kombinationer av 1 bit (1 o 0), men 4 för 2 bitar.

Permalänk
Medlem

Aqualize:
Tal växer med det dubbla om du adderar 1 bit (vilket är den minsta enhet som kan representeras i en dator). Att spara talet 9 i en dator tar mer än 1 bit. Jag är väl medveten om att han "vill göra om" det till decimal form först. Om vi säger att filen är 40 byte stor (oerhört liten fil) så skulle det ge ett maximalt tal på 1099511627776.

Filen tar ursprungligen 40 byte.
Primtalsfaktorerna tar mer än 40 byte att spara. (i filen du sparar faktorerna måste du på något sätt separera primtalen om du har variabel storlek, eller så tar varje primtal x faktor minst 8 byte. Dvs han skulle träffa exakt rätt tal på mindre än 5 olika sorters primtal. Lycka till.

vb_
Om du ska ha ett variabelt talsystem måste du ha en annan variabel som säger vilket talsystem som anävnds (hur många bitar talet har). Att spara den informationen tar i sin tur plats och måste sparas i en förangiven storlek. (du kan inte gissa hur många bitar du ska läsa från fil.)

Glöm idéen.

Permalänk

En grundläggande tanke i informationsteorin är att man bara måste sända (i det här fallet spara på disk och 'sända' till framtiden) det man inte redan känner till på andra sidan.
Att byta talbas är ingen komprimering, bara ett annat sätt att representera samma information. Till exempel kan man gå från binär till hexadecimal form och därmed "korta" av datat till 1/4, fast det är ganska lätt att inse att ingen egentlig komprimering har skett.

Om du skulle ge mig talet 2^30*3^11 och be mig komprimera det så skulle det inte vara några problem, jag slänger bort talet och använda 0 byte av mitt dyrbara minne. Sen när du kommer nästa gång och ber mig hämta talet du bad mig komprimera så frågar jag dig, vilket tal? Och du svarar 2^30*3^11. Då kan jag komprimera upp talet utan att ha använt något utrymme alls, eftersom du redan visste vilket tal som låg där. Snacka om komprimering va

Det finns en (bevisat) optimal algoritm för förlustfri komprimering, Huffmann-algoritmen. Den är lätt att förstå och det finns en himla massa sidor på tha Internet att titta på.

Permalänk
Medlem

Tack för alla svar, kul att kunna få det ur mitt huvud iaf. Nu vet jag varför det inte skulle gå

Visa signatur

Core 2 Quad Q6600 | Gigabyte GA-P35-DS3 | Corsair XMS2-6400 2x2048MB | Corsair HX 520W | BFG 8800GT

Permalänk
Medlem

Alla geni finns i Linköping.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av ilmarinen
Det finns en (bevisat) optimal algoritm för förlustfri komprimering, Huffmann-algoritmen. Den är lätt att förstå och det finns en himla massa sidor på tha Internet att titta på.

Huffman kodning eller har Huffman hittat på flera?
Jag känner till den men är den generellt optimal för godtycklig data. Men det borde väl finnas specialfall där annan kodning kan vara bättre? Typ om symbolerna har exakt lika frekvens.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Citat:

Ursprungligen inskrivet av Aqualize
Huffman kodning eller har Huffman hittat på flera?
Jag känner till den men är den generellt optimal för godtycklig data. Men det borde väl finnas specialfall där annan kodning kan vara bättre? Typ om symbolerna har exakt lika frekvens.

Uppenbarligen, annars skulle ju inte PNG och Flac göra någon nytta, vi skulle kunna använda huffman för allt?

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Uppenbarligen, annars skulle ju inte PNG och Flac göra någon nytta, vi skulle kunna använda huffman för allt?

Ja, men det är ju det vi gör nästan

PNG använder deflate vilket i sin tur är en kombination av LZ77 och huffman:

DEFLATE is a lossless data compression algorithm that uses a combination of the LZ77 algorithm and Huffman coding. It was originally defined by Phil Katz for version 2 of his PKZIP archiving tool, and was later specified in RFC 1951.

http://en.wikipedia.org/wiki/DEFLATE_%28algorithm%29

FLAC:

... To do this, FLAC takes advantage of the fact that the error signal generally has a Laplacian (two-sided geometric) distribution, and that there are a set of special Huffman codes called Rice codes that can be used to efficiently encode these kind of signals quickly and without needing a dictionary.

http://flac.sourceforge.net/documentation.html#format

Permalänk
Medlem

TechGuru: Ok, kanske inte formulerade mig så bra ser jag nu, om det alls var rätt tänkt Det jag menade var att man talsystemet inte spelar ngn roll (utan att jag testade om det skulle bli längre i just det här fallet med bytes). Låt säga att du gör komprimeringen på papper istället, om man har 1-9 samt "mellanslag" som sina tecken, och det kommer ändå inte hjälpa oavsett vilken komprimeringsalgo du använder. Aja, vi är uppenbarligen överens om att det inte funkar i vilket fall

Aqualize: Nej,
http://en.wikipedia.org/wiki/Huffman_coding
"Huffman coding is optimal when the probability of each input symbol is a negative power of two"

Permalänk
Medlem

Aritmetisk kodning är bättre än huffman. Inte så mycket men lite iaf.

Tyävrr är aritmetisk kodning fortfarande patenterad. IBM samt AT&T har patent. (togs 81-84 så det borde itne vara patenterat så länge till)

Huffman är inte längre patenterat, patentet togs 1952 och kan därför vad jag förstår användas fritt.

Permalänk
Medlem

Nu har jag inte läst allt, men ganska många tal är ju faktiskt primtal, dem kan du ju inte komprimera alls med denna "algoritmen".

Visa signatur

g++