% a script to determine how many perfect shuffles are required
% before a given deck of cards returns to its original order

clear all, close all

% problem statement:
% suppose we have a deck of 8 (distinct) cards
% 1 2 3 4 5 6 7 8

% define a perfect shuffle as interleaving the cards as follows
% 1 5 2 6 3 7 4 8

% in other words, given a deck of an even number of distinct cards,
% divide the deck in half,
% then alternately insert cards from the bottom half into the top half

% for a deck of 8 cards, it is easily seen that the original order
% is obtained after 3 applications of this process

% the task is to write a program that tests this out for N cards,
% where we are particularly interested in the case N=52, 
% the size of a standard deck of cards

% here are the basic steps:
% get the size of the deck
% check that the input is valid
% initialize deck to unique cards
% repeat:
%    perfectly shuffle the deck
%    keep track of how many shuffles have been made
% until: original order has been obtained

disp('Counting perfect shuffles of decks with an even number of cards.')
disp(' ')

N = input('Please enter size of deck: ');

% check that N is a (positive!) even number; else fail
if ((N < 0) | (rem(N,2) ~= 0)),
  error('Deck must contain an even number of cards.');
end

% initialize deck to unique cards
originalDeck = [1:N]';
shuffles     = 0;

% perform the first shuffle explicitly
shuffledDeck = perfectShuffle(originalDeck);
shuffles     = shuffles + 1;

while (~isequal(shuffledDeck,originalDeck)),
  shuffledDeck = perfectShuffle(shuffledDeck);
  shuffles     = shuffles + 1;
end

disp(['A deck of size ', num2str(N), ' requires ', num2str(shuffles), ...
       ' perfect shuffles before it returns to its original state.'])