MathGroup Archive 2003

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Programming Probability of puzzle in Mathematica

  • To: mathgroup at smc.vnet.net
  • Subject: [mg44912] Re: Programming Probability of puzzle in Mathematica
  • From: drbob at bigfoot.com (Bobby R. Treat)
  • Date: Mon, 8 Dec 2003 02:29:19 -0500 (EST)
  • References: <bqv1op$t07$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

I found 19 positive solutions, only of which involve all nine digits.
One of those (take your pick) is the numerator for the probability you
want. If every draw is a matrix with all nine digits in it, the
denominator is 9 factorial. If every draw is a matrix of 9 one-digit
numbers (with possible repeats), the denominator is 9^9.

Here's a brute force way to find the solutions. (It's probably
unnecessarily complicated, but maybe it's instructive.)

We'll need KSubsets, so load...

<< DiscreteMath`Combinatorica`

Here are the equations and variables.

row[j_] := Sum[a[i + 3(j - 1)], {i, 1, 3}] == 15
column[j_] := Sum[a[j + 3(i - 1)], {i, 1, 3}] == 15
diagonal[1] := a[1] + a[5] + a[9] == 15
diagonal[2] := a[3] + a[5] + a[7] == 15
equations = Flatten@{row /@ Range@3, column /@ Range@3, diagonal /@
Range@2}
variables = Array[a, 9]

Solutions look like this (neglecting that solutions have to be
integers, etc.):

Off[Solve::"svars"]
Solve[equations, variables]

We'll solve for the last 7 variables in terms of the first two:

rules = First@Solve[equations, Drop[variables, -2]]

Given an eighth and ninth digit, the following function computes the
others and checks whether the solution is positive:

positive[{x_, y_}] := Module[{s, ok},
    s = variables /. rules /. {a[8] -> x, a[9] -> y};
    ok = And @@ Thread[s >= 1];
    {s, ok}
    ]

Here's a list of the positive solutions:

vectors = Cases[positive /@ KSubsets[Range@9, 2], {x_List, True} :>
x];
vectors // Length

Next we display them as 3x3 matrices:

matrix[x_List] /; Length[x] == 9 := 
    Table[x[[i + 3(j - 1)]], {i, 1, 3}, {j, 1, 3}]
matrix /@ vectors // TableForm

If we want solutions involving all 9 digits, we replace the 'positive'
function as follows:

nine[{x_, y_}] := Module[{s, ok},
    s = variables /. rules /. {a[8] -> x, a[9] -> y};
    ok = Union[s] == Range[9];
    {s, ok}
    ]
vectors = Cases[nine /@ KSubsets[Range@9, 2], {x_List, True} :> x];
vectors // Length
matrix /@ vectors // TableForm

Bobby

mathtutoring at comcast.net (art burke) wrote in message news:<bqv1op$t07$1 at smc.vnet.net>...
> Hi to all:
> 
> Not being a programmer, but yet inquisitive, I'd like to come up with
> several small programs that compute the probability of random numbers
> being
> inserted into let's say, a magic cube, triangle, or such that all
> rows, columns, and diagonals add up to a certain number.
> 
> Let's say a 3x3 magic square, using the numbers 1,2,3,4,5,6,7,8 and 9.
> Of course, if you know how to put them into the magic square, all
> rows, diagonals, and columns add up to 15.
> 
> Having Mathematica insert random numbers in cells, compute all sums
> and see if it has it correct, and keep up the repetions until it comes
> up with an average probability, let's say after 1000 tries....What
> would be the probability?
> 
> I've been quit interested in this for a while, but am wondering how it
> would be done??
> 
> Thanks for all the help,
> 
> Art


  • Prev by Date: Re: Re: How to stop a kerne calculationl without stopping the frontend
  • Next by Date: Re: Re: Re: Suggestion: Visualization of complex functions with Mathematica
  • Previous by thread: Re: Programming Probability of puzzle in Mathematica
  • Next by thread: Re: Programming Probability of puzzle in Mathematica