Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??
Very interesting topic!

I see an overall pattern, which I would like to share :-)

First, a few basic observations:
  • There seems to be a certain symmetry evident from how R & R results in 8 bits set on average (halfway between 1 and 16) versus R | R resulting in 24 bits set on average (halfway between 16 and 32). I'll be sure to make my hypothesis symmetrical, in that regard.
  • If we apply AND, the average bits set goes down due to higher likelihood of 0 bits swallowing the 1 bits. Conversely, if we apply OR, the average bits set goes up due to higher likelihood of 1 bits overriding the 0 bits.
  • Non-associative rules apply for AND and OR:

      ( (A & B) | C )  !=  ( A & (B | C) )

    So evaluating the expression from left-to-right is important! Update: Perl gives precedence to the & operator over |

Hypothesis:

Each AND/OR operation is evaluated in the following way:
    ( <left_gained_avg_bits_set> <op> <right_modifier> ) = <resulting_avg_bits_set>
Whenever an AND/OR <op> is applied, it induces a change to the already gained average bits on the left-side. That change is a multiplicative factor determined by the average bits set on the right-side:

    right_mod_factor = right_avg_set_bits / total_bits

Cases:

For <op> = AND, we would take right_mod_factor and multiply it with left_avg_bits_set to get <resulting_avg_bits_set>. Examples:
    R & (R & R) => 16 * (8 / 32) = 4 bits set on average

    (R | R) & (R & R & R) => 24 * (4 / 32) = 3 bits set on average

That is, if there are more bits set on average on the AND right-side, there will be less chance of swallowing, so more bits are set on average in the result.

Conversely, for <op> = OR, we would take right_mod_factor and multiply it with left_avg_unset_bits. Then, take that result and add it to left_avg_set_bits to get <resulting_avg_bits_set>. Examples:
    R | (R | R) => 16 + 16 * (24 / 32) = 28 bits set on average [second 16 is # of avg unset bits]

    (R | R) | (R & R & R) => 24 + 8 * (4 / 32) = 25 bits set on average

    R & R & R | R | R = (R & R & R) | (R | R) => 4 + 28 * (24 / 32) = 25 bits set on average
    or
    R & R & R | R | R = (R & R & R) | R | R => 4 + 28 * (16 / 32) + 14 * (16 / 32) = 25 bits set on average [got 14 from 32 - ( 4 + 28 * (16 / 32) )]

That is, if there are more bits set on average on the OR right-side, there will be more chance of overriding, so more bits are set on average in the result.

Conclusion:

So, following my pattern hypothesis, I see some inconsistent results in your "full set". For instance, 7 of ( R & R | R & R ) & R evaluates to 5 bits set on average. Attention has to be paid to precedence of AND/OR evaluations. Also, 22 & 26 are the same, when 22 of R & R | R | R evaluates to 26 bits set on average.

There may be some fallacy in my hypothesis, so feedback is welcomed :)

So, given the following legend:
    n = total # bits per sample L1 = # bits set on average on left-side of AND/OR L0 = # bits unset on average on left-side of AND/OR = n - L1 R1 = # bits set on average on right-side of AND/OR

we can derive a set of equations to calculate the resulting average bits set for each AND/OR operation:
    AND : L1 * R1 / n OR : L1 + L0 * R1 / n = L1 + (n - L1) * R1 / n = L1 + R1 - L1 * R1 / n = L1 * ( 1 - R1 / n ) + R1


In reply to Re: Boolean math: Fill in the blanks. by repellent
in thread Boolean math: Fill in the blanks. by BrowserUk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others having an uproarious good time at the Monastery: (8)
    As of 2014-12-19 05:02 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      Is guessing a good strategy for surviving in the IT business?





      Results (70 votes), past polls