<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: GLH compression</title>
	<atom:link href="http://kamps.org/haje/glh-compression/feed/" rel="self" type="application/rss+xml" />
	<link>http://kamps.org/haje/glh-compression/</link>
	<description>Assorted ramblings from what passes for a brain these days</description>
	<lastBuildDate>Wed, 03 Mar 2010 19:23:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: mygulamali</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-63758</link>
		<dc:creator>mygulamali</dc:creator>
		<pubDate>Fri, 20 Feb 2009 23:33:02 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-63758</guid>
		<description>Neato.  Of course, you know that your compression algorithm essentially creates a frequency graph of the alphabet.  Cryptanalysts use such things to decipher messages so they&#039;ve been well studied already.  So given the total number of characters in a message, and knowing what language it is written in, you could probably guesstimate what the final compressed message would look like before you even compress it.

And hey, who needs decompression anywayz?  Like those people who&#039;ve had themselves cryogenically frozen, you could compress EVERYTHING and then wait for some revolution in discrete maths or something, so that you can decompress the information back to normal.  At least your HDD wouldn&#039;t be full in the meantime, eh? :)</description>
		<content:encoded><![CDATA[<p>Neato.  Of course, you know that your compression algorithm essentially creates a frequency graph of the alphabet.  Cryptanalysts use such things to decipher messages so they&#8217;ve been well studied already.  So given the total number of characters in a message, and knowing what language it is written in, you could probably guesstimate what the final compressed message would look like before you even compress it.</p>
<p>And hey, who needs decompression anywayz?  Like those people who&#8217;ve had themselves cryogenically frozen, you could compress EVERYTHING and then wait for some revolution in discrete maths or something, so that you can decompress the information back to normal.  At least your HDD wouldn&#8217;t be full in the meantime, eh? <img src='http://kamps.org/haje/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Colin</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60934</link>
		<dc:creator>Colin</dc:creator>
		<pubDate>Sun, 07 Sep 2008 19:13:00 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60934</guid>
		<description>I feel I must point out that the above comments attributed to me were cut and paste by Haje, and that some of those numbers ought to be superscript ;) Also, and that the HTML entity I was looking for was &#039;isin&#039;:

n!/(&#928;:l&#8712;L.nl!)</description>
		<content:encoded><![CDATA[<p>I feel I must point out that the above comments attributed to me were cut and paste by Haje, and that some of those numbers ought to be superscript <img src='http://kamps.org/haje/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Also, and that the HTML entity I was looking for was &#8216;isin&#8217;:</p>
<p>n!/(&Pi;:l&isin;L.nl!)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: colin</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60902</link>
		<dc:creator>colin</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:44:14 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60902</guid>
		<description>Actually, for 4 elements of either a or b, there&#039;s 6 possible combinations:
Each of A and B have 2 elements, and we&#039;re selecting 4, so that&#039;s 4! / (2! . 2!), which is six. Iterating over the equivalent ones, there&#039;s aabb abab abba and the complements of these, bba, baba and baab.

Using your first set of numbers for your lorem ipsum without punctuation, we can calculate that in bc:

define f(x) {
if (x &gt; 1) {
return x * (f(x-1))
}
return (1)
}
f(457) / ( f(24) *f(4) *f(20) *f(12) *f(51) *f(4) *f(6) *f(2) *f(38) *f(27) *f(16) *f(16) *f(15) *f(9) *f(4) *f(19) *f(32) *f(32) *f(35) *f(5) )

This comes out as the rather scary looking number:

24979676534385811028057980738663929391311867252395764304516513933684\
07606995096461303297817015351090284443259502380977579433712838416708\
45657900380181004097489062467705784954149469973163067321876126281229\
95907974733847026378002417559136955864960723139702457366278743422910\
76636180848502418461402452003145682339219616138491354732354517049290\
51034504318969704763573143447683688097296432449198854267451150579323\
49228888314823997292233314267179896978363474923474304843679668468255\
73366601896030037525678558877315402684142226202299224543792913670945\
70000940885751377191355034261912546595703027389104226535408140288000\
000000000000000000000000000000000000

...which is rather a lot of permutations.

If we assume 256 bits of hash data, we can divide this by 256 to get the number of permutations which will have the &#039;correct&#039; checksum:

21572869700269331363124886806112228769291733255504027739303788591328\
37593298077865107496638668440706109266915612818099283527034418172707\
01882144552441912911611801039139944057017098915043865571617967016035\
92589594716339665906531835614143615869909227133379553874233921484767\
47750403478423115256020571862056979617852935949009025260523624674180\
80639965507183997390890815727819484329822253815589392749146335206762\
86330737257959530160336903679419768794361552184405895656881407312010\
61956861464362784040149412132287866816164180237900313291906666105277\
855060107509415077378619659

That gives us one &#039;true&#039; positive, and 21572869700269331363124886806112228769291733255504027739303788591328\
37593298077865107496638668440706109266915612818099283527034418172707\
01882144552441912911611801039139944057017098915043865571617967016035\
92589594716339665906531835614143615869909227133379553874233921484767\
47750403478423115256020571862056979617852935949009025260523624674180\
80639965507183997390890815727819484329822253815589392749146335206762\
86330737257959530160336903679419768794361552184405895656881407312010\
61956861464362784040149412132287866816164180237900313291906666105277\
855060107509415077378619658 false positives.

Using a dictionary is a fairly smart way of eliminating a lot of that, which reduces the order of the problem to something close to putting the correct words in the right order, but I don&#039;t know if dictionaries are allowed in the competition&#039;s rules? If they are I&#039;d imagine most approaches exploit a dictionary in some way.</description>
		<content:encoded><![CDATA[<p>Actually, for 4 elements of either a or b, there&#8217;s 6 possible combinations:<br />
Each of A and B have 2 elements, and we&#8217;re selecting 4, so that&#8217;s 4! / (2! . 2!), which is six. Iterating over the equivalent ones, there&#8217;s aabb abab abba and the complements of these, bba, baba and baab.</p>
<p>Using your first set of numbers for your lorem ipsum without punctuation, we can calculate that in bc:</p>
<p>define f(x) {<br />
if (x &gt; 1) {<br />
return x * (f(x-1))<br />
}<br />
return (1)<br />
}<br />
f(457) / ( f(24) *f(4) *f(20) *f(12) *f(51) *f(4) *f(6) *f(2) *f(38) *f(27) *f(16) *f(16) *f(15) *f(9) *f(4) *f(19) *f(32) *f(32) *f(35) *f(5) )</p>
<p>This comes out as the rather scary looking number:</p>
<p>24979676534385811028057980738663929391311867252395764304516513933684\<br />
07606995096461303297817015351090284443259502380977579433712838416708\<br />
45657900380181004097489062467705784954149469973163067321876126281229\<br />
95907974733847026378002417559136955864960723139702457366278743422910\<br />
76636180848502418461402452003145682339219616138491354732354517049290\<br />
51034504318969704763573143447683688097296432449198854267451150579323\<br />
49228888314823997292233314267179896978363474923474304843679668468255\<br />
73366601896030037525678558877315402684142226202299224543792913670945\<br />
70000940885751377191355034261912546595703027389104226535408140288000\<br />
000000000000000000000000000000000000</p>
<p>&#8230;which is rather a lot of permutations.</p>
<p>If we assume 256 bits of hash data, we can divide this by 256 to get the number of permutations which will have the &#8216;correct&#8217; checksum:</p>
<p>21572869700269331363124886806112228769291733255504027739303788591328\<br />
37593298077865107496638668440706109266915612818099283527034418172707\<br />
01882144552441912911611801039139944057017098915043865571617967016035\<br />
92589594716339665906531835614143615869909227133379553874233921484767\<br />
47750403478423115256020571862056979617852935949009025260523624674180\<br />
80639965507183997390890815727819484329822253815589392749146335206762\<br />
86330737257959530160336903679419768794361552184405895656881407312010\<br />
61956861464362784040149412132287866816164180237900313291906666105277\<br />
855060107509415077378619659</p>
<p>That gives us one &#8216;true&#8217; positive, and 21572869700269331363124886806112228769291733255504027739303788591328\<br />
37593298077865107496638668440706109266915612818099283527034418172707\<br />
01882144552441912911611801039139944057017098915043865571617967016035\<br />
92589594716339665906531835614143615869909227133379553874233921484767\<br />
47750403478423115256020571862056979617852935949009025260523624674180\<br />
80639965507183997390890815727819484329822253815589392749146335206762\<br />
86330737257959530160336903679419768794361552184405895656881407312010\<br />
61956861464362784040149412132287866816164180237900313291906666105277\<br />
855060107509415077378619658 false positives.</p>
<p>Using a dictionary is a fairly smart way of eliminating a lot of that, which reduces the order of the problem to something close to putting the correct words in the right order, but I don&#8217;t know if dictionaries are allowed in the competition&#8217;s rules? If they are I&#8217;d imagine most approaches exploit a dictionary in some way.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Haje Jan Kamps</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60901</link>
		<dc:creator>Haje Jan Kamps</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:43:46 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60901</guid>
		<description>Also: I was thinking about the same thing earlier today, actually. My
calculation in the post presumes that a 4-letter plaintext message has
4^26 possible options, but if the plaintext message is aaab, there are,
in fact, only 4 possible combinations - because 4^26 doesn&#039;t take into
account that we don&#039;t care which of the a&#039;s are in which position.

This drastically reduces the number of bruteforce possibilities, but I
don&#039;t really know how to express this mathematically - I believe
&#039;permutations&#039; is the mathematical field I&#039;m looking at, but it&#039;s well
beyond the calculus level I stopped at, I think.</description>
		<content:encoded><![CDATA[<p>Also: I was thinking about the same thing earlier today, actually. My<br />
calculation in the post presumes that a 4-letter plaintext message has<br />
4^26 possible options, but if the plaintext message is aaab, there are,<br />
in fact, only 4 possible combinations &#8211; because 4^26 doesn&#8217;t take into<br />
account that we don&#8217;t care which of the a&#8217;s are in which position.</p>
<p>This drastically reduces the number of bruteforce possibilities, but I<br />
don&#8217;t really know how to express this mathematically &#8211; I believe<br />
&#8216;permutations&#8217; is the mathematical field I&#8217;m looking at, but it&#8217;s well<br />
beyond the calculus level I stopped at, I think.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Colin</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60900</link>
		<dc:creator>Colin</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:43:19 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60900</guid>
		<description>Actually, I was thinking about 457^29 while doing the dishes, and realised that this is probably intended to represent the raw number of combinations of 457 characters before cutting them down with the set, yes? If that&#039;s the case, the corect number would be 29^457, which is much, much bigger.

The number I was thinking you meant was the number of permutations after considering your letter set, which is actually

n!/(Π:l&memb;L.nl!)

(and if html doesn&#039;t have capital π or set membership entities, I shall be upset)

where L is the set of letters in your dictionary and nl is the number of instances of the letter l in the message.

I don&#039;t know how big that is for your 457 character message, but it&#039;s probably quite big, although it should be significantly smaller than 29^457.</description>
		<content:encoded><![CDATA[<p>Actually, I was thinking about 457^29 while doing the dishes, and realised that this is probably intended to represent the raw number of combinations of 457 characters before cutting them down with the set, yes? If that&#8217;s the case, the corect number would be 29^457, which is much, much bigger.</p>
<p>The number I was thinking you meant was the number of permutations after considering your letter set, which is actually</p>
<p>n!/(Π:l&memb;L.nl!)</p>
<p>(and if html doesn&#8217;t have capital π or set membership entities, I shall be upset)</p>
<p>where L is the set of letters in your dictionary and nl is the number of instances of the letter l in the message.</p>
<p>I don&#8217;t know how big that is for your 457 character message, but it&#8217;s probably quite big, although it should be significantly smaller than 29^457.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Colin</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60899</link>
		<dc:creator>Colin</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:42:05 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60899</guid>
		<description>It certainly sounds plausible, but unfortunately it&#039;s not quite. The killer lies in this sentence:

&quot;Gwyn came up with the suggestions of using two hashes - if you hash the final file with, say, MD5 and SHA1, it becomes extremely unlikely that a solution which matches with both hashes would be a false positive.&quot;

What&#039;s true to say is that it&#039;s less likely a double-match would be a false positive than a single match is. If the second hash is, say, 128 bits, then it&#039;s 2^128 times less likely that it&#039;s a false positive.

Unfortunately, when the message length (in terms of the amount of information in the message) is so much longer than the hash, the chances of any given positive result being the correct result are are so much smaller than the chance of a it being a hash collision, that there are still far more double-hash collisions than there are genuine positives.

It&#039;s just about plausible for the first number you mention, 457^29 case, which is about the same as 2^256, (which is to say, there&#039;s just as much information in the hash as there is in the ) assuming you have a total of 256 bits worth of hash, but it doesn&#039;t scale up: the probability (and therefore number) of false positives increases exponentially with the amount of information you add, or linearly with the number of permutations.

To break it down to a trivial case to make it obvious, say you have some letters you&#039;re trying to arrange in such a way that there&#039;s only 256 combinations of them. This naturally takes up 8 bits, and you try to encode this using a 2-bit hash. No matter how good, algorithmically, that 2-bit hash is, it can only ever reduce the number of possibilities by a factor of 22, so you&#039;ll still have 256/4 = 64 positives, 63 of which are false. The same things applies when you scale up to 128-bit hashes with 2^(128+8-2)-bit messages.

Wowwie, I&#039;m such a killjoy. But at least it&#039;s Friday, right? :)</description>
		<content:encoded><![CDATA[<p>It certainly sounds plausible, but unfortunately it&#8217;s not quite. The killer lies in this sentence:</p>
<p>&#8220;Gwyn came up with the suggestions of using two hashes &#8211; if you hash the final file with, say, MD5 and SHA1, it becomes extremely unlikely that a solution which matches with both hashes would be a false positive.&#8221;</p>
<p>What&#8217;s true to say is that it&#8217;s less likely a double-match would be a false positive than a single match is. If the second hash is, say, 128 bits, then it&#8217;s 2^128 times less likely that it&#8217;s a false positive.</p>
<p>Unfortunately, when the message length (in terms of the amount of information in the message) is so much longer than the hash, the chances of any given positive result being the correct result are are so much smaller than the chance of a it being a hash collision, that there are still far more double-hash collisions than there are genuine positives.</p>
<p>It&#8217;s just about plausible for the first number you mention, 457^29 case, which is about the same as 2^256, (which is to say, there&#8217;s just as much information in the hash as there is in the ) assuming you have a total of 256 bits worth of hash, but it doesn&#8217;t scale up: the probability (and therefore number) of false positives increases exponentially with the amount of information you add, or linearly with the number of permutations.</p>
<p>To break it down to a trivial case to make it obvious, say you have some letters you&#8217;re trying to arrange in such a way that there&#8217;s only 256 combinations of them. This naturally takes up 8 bits, and you try to encode this using a 2-bit hash. No matter how good, algorithmically, that 2-bit hash is, it can only ever reduce the number of possibilities by a factor of 22, so you&#8217;ll still have 256/4 = 64 positives, 63 of which are false. The same things applies when you scale up to 128-bit hashes with 2^(128+8-2)-bit messages.</p>
<p>Wowwie, I&#8217;m such a killjoy. But at least it&#8217;s Friday, right? <img src='http://kamps.org/haje/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Silly Algorithms Over Lunch &#124; Wildfalcon</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60898</link>
		<dc:creator>Silly Algorithms Over Lunch &#124; Wildfalcon</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:33:18 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60898</guid>
		<description>[...] once again got the chance yesterday to take 30 mins out of the otherwise stressful day to create a new compression algorithm which can reduce the content of Wikipedia (100Mb) down to 225 bytes, beating the previous record of [...]</description>
		<content:encoded><![CDATA[<p>[...] once again got the chance yesterday to take 30 mins out of the otherwise stressful day to create a new compression algorithm which can reduce the content of Wikipedia (100Mb) down to 225 bytes, beating the previous record of [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Graeme Taylor</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60895</link>
		<dc:creator>Graeme Taylor</dc:creator>
		<pubDate>Fri, 05 Sep 2008 11:19:46 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60895</guid>
		<description>Some pencil and paper work shows it&#039;s actually easy to calculate the number of distinct n-character strings featuring x1 of symbol 1, x2 of symbol 2... x29 of symbol 29 by (n!)/(x1!)(x2!)....(x29!) . So for the particular xi&#039;s for your lorem ipsum example this gives a search space of size k where k is a 648 digit number that probably won&#039;t make it through the spam filter, but is about 10^21 times smaller than the naive space of all 457-character strings.</description>
		<content:encoded><![CDATA[<p>Some pencil and paper work shows it&#8217;s actually easy to calculate the number of distinct n-character strings featuring x1 of symbol 1, x2 of symbol 2&#8230; x29 of symbol 29 by (n!)/(x1!)(x2!)&#8230;.(x29!) . So for the particular xi&#8217;s for your lorem ipsum example this gives a search space of size k where k is a 648 digit number that probably won&#8217;t make it through the spam filter, but is about 10^21 times smaller than the naive space of all 457-character strings.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Graeme Taylor</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60893</link>
		<dc:creator>Graeme Taylor</dc:creator>
		<pubDate>Fri, 05 Sep 2008 10:56:33 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60893</guid>
		<description>Oops, and now I&#039;m making mistakes myself. For a 29 letter alphabet, there are 29^457 (669 digit number) possible 457-character strings, not 457^29 (78 digit number). So our comparison is 29^457 (naive string generation) against something smaller than 457! for selection without replacement via the compression data; but that&#039;s a much bigger number so I really need to factor in those repeated strings. Also I shouldn&#039;t have stopped reading at the code as I see you considered the hash-only approach...</description>
		<content:encoded><![CDATA[<p>Oops, and now I&#8217;m making mistakes myself. For a 29 letter alphabet, there are 29^457 (669 digit number) possible 457-character strings, not 457^29 (78 digit number). So our comparison is 29^457 (naive string generation) against something smaller than 457! for selection without replacement via the compression data; but that&#8217;s a much bigger number so I really need to factor in those repeated strings. Also I shouldn&#8217;t have stopped reading at the code as I see you considered the hash-only approach&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Graeme Taylor</title>
		<link>http://kamps.org/haje/glh-compression/comment-page-1/#comment-60892</link>
		<dc:creator>Graeme Taylor</dc:creator>
		<pubDate>Fri, 05 Sep 2008 10:39:29 +0000</pubDate>
		<guid isPermaLink="false">http://kamps.org/haje/?p=274#comment-60892</guid>
		<description>Whilst I agree that your decompression is going to be painfully slow, I&#039;ve got to question the numbers on just how slow. 

You argue that with a 29 letter alphabet, you have 457^29 possible 457-character strings, of which only one is your lorem ipsum example. This is true, but ignores your compressed data entirely: for instance, one of those strings is 457 z&#039;s, which you can clearly eliminate from consideration by comparing to your a4530 b660 c2406.. data. In fact, taking this approach you&#039;d have an even shorter compression algorithm: just tell someone the message length and the hash, and let them generate strings of that length and test for collision to recover the message. 

By specifying the aggregate data, you&#039;ve already told me what 457 letters I need, just not the order; so I have a pool to draw from. Were all those letters distinct, I&#039;d have a 1/457 chance of getting the first one right, then 1/456 of the next and so on... for 457! possibilities. Still awful, but better- and it would also means that capitals or other symbols make no difference to the odds of success- imagine pulling unique scrabble tiles out of a bag and lining them up; whether the string is right or wrong depends on the order out the bag, not the alphabet employed to make the tiles.

However, as we don&#039;t have 457 distinct tiles, but some selection of 457 from 29 (or 55, or whatever) types, a lot of the strings generated will be the same. For instance, v1w1x1y1z1 is 5 letters, with 5!=120 possible arrangements. But a3b2 only gives you 10 possible strings- choose 2 places out of 5 to put the b&#039;s, and the a&#039;s fill in the rest. Working out the possible unique arrangements of 29 symbols with multiplicity sounds a bit tough for a Friday morning, but I&#039;ll keep it in mind if I&#039;m teaching Discrete Math again next semester!</description>
		<content:encoded><![CDATA[<p>Whilst I agree that your decompression is going to be painfully slow, I&#8217;ve got to question the numbers on just how slow. </p>
<p>You argue that with a 29 letter alphabet, you have 457^29 possible 457-character strings, of which only one is your lorem ipsum example. This is true, but ignores your compressed data entirely: for instance, one of those strings is 457 z&#8217;s, which you can clearly eliminate from consideration by comparing to your a4530 b660 c2406.. data. In fact, taking this approach you&#8217;d have an even shorter compression algorithm: just tell someone the message length and the hash, and let them generate strings of that length and test for collision to recover the message. </p>
<p>By specifying the aggregate data, you&#8217;ve already told me what 457 letters I need, just not the order; so I have a pool to draw from. Were all those letters distinct, I&#8217;d have a 1/457 chance of getting the first one right, then 1/456 of the next and so on&#8230; for 457! possibilities. Still awful, but better- and it would also means that capitals or other symbols make no difference to the odds of success- imagine pulling unique scrabble tiles out of a bag and lining them up; whether the string is right or wrong depends on the order out the bag, not the alphabet employed to make the tiles.</p>
<p>However, as we don&#8217;t have 457 distinct tiles, but some selection of 457 from 29 (or 55, or whatever) types, a lot of the strings generated will be the same. For instance, v1w1&#215;1y1z1 is 5 letters, with 5!=120 possible arrangements. But a3b2 only gives you 10 possible strings- choose 2 places out of 5 to put the b&#8217;s, and the a&#8217;s fill in the rest. Working out the possible unique arrangements of 29 symbols with multiplicity sounds a bit tough for a Friday morning, but I&#8217;ll keep it in mind if I&#8217;m teaching Discrete Math again next semester!</p>
]]></content:encoded>
	</item>
</channel>
</rss>
