This document applies to the C# Version 2.1.1.11665 of JosephusCS,
Copyright (c) 1981-2008 by author: Harry J. Smith, Saratoga, CA.
Introduction -
When you execute the program JosephusCS.exe it responds by displaying the
Startup form:
Just click the Run button and the Run form is displayed.
Run form -
The Run form has one large text box for text output.
If the program is executed from the DOS prompt with one or more arguments, the
arguments are ignored.
Pressing the Help F1 key causes the Help form to be displayed:
The Help form is scrollable and resizable. It helps explains what the program
does.
JosephusCS is a program that solves the Josephus Permutation problem:
Challenge given in REC Jan/Feb/Mar 1991 on page 24.
"The Thousand Roman Slaves" suggested by Steve Wagler
Original Problem: 1000 slaves in a circle, numbered 1 to 1000, are all to
be shot except one lucky survivor. The order of shooting is 1, 3, 5, etc.,
always alternating, and always immediately removing the fallen bodies. Once
a body has fallen, it is no longer considered part of the circle for
purposes of future counting and alternation. Example, n=6: Shoot 1,3,5,2,6;
4 survives.
The General Problem: There is an ordered set of n objects arranged in a
circle with object i (1 <= i <= n) in position i. All n objects are
selected and removed in a certain order and placed in a new circle with
the new position number k beings the order of selection. Object f is
selected first. After each selection, m minus 1 of the remaining objects
following the one removed are skipped and the next object is then
selected. We are interested in the nature of the permutation generated by
this process, its fixed elements, and in particular the original position
L of the last object selected. Note that m and f can be as low as 1 and
can be larger than n.
n = The number of objects in the circle
f = index of first object to be selected [1, n]
m = difference in index of items selected, m = 2 => every other
"Max Pointed Plotted" can be set to a value from 1 to 1000000. The
nominal starting value is 200 and it can only be changed on the Startup
form. Large values of this parameter can cause the Plot form to take a
very long time before the plot appears and the program may have to be
terminated manually by clicking the X in the upper right hand corner of
the Plot form or the Run form. If n is greater than Max Points Plotted,
only the first Max Points Plotted points will be plotted.
See Knuth, The Art of Computer Programming, Vol. 1, Pages 158-159, 181,
516, 521 and Vol. 3, Pages 18-19, 579.
--------------------------------------------------------------------------------
+------------Function Keys on Run form------------+
| F1 => Display Help form |
| F2 => Quit and go back to the Startup form |
| F5 => Get Status of calculation |
| F6 => Display Configuration form |
| F7 => Outputs a simple permutation report |
| F8 => Outputs a detailed permutation report |
| F9 => Toggle Logging to Log file on/off |
| F11 => Clear output text box |
| F12 => Brings up the Plot form and plots |
| Ctrl+F9 => Clear Log File |
| ESC => Interrupt/Abort a long calculation |
+-------------------------------------------------+
--------------------------------------------------------------------------------
Example output:
--------------------
n = 1000, f = 1, m = 2: Object 976 was selected last!
There is 1 fixed element: 1.
--------------------
n = 1000, f = 32767 => 767, m = 32767: Object 481 was selected last!
There are 5 fixed elements: 41, 178, 619, 710, 718.
--------------------
n = 1000, f = 1, m = 1: Object 1000 was selected last!
There are 1000 fixed elements: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... .
--------------------
Execution order, when object i was selected:
5 4 6 1 3 8 7 2
Order of execution, object # selected on k'th selection:
4 8 5 2 1 3 7 6
The resulting permutation expressed in cyclic notation:
(1, 5, 3, 6, 8, 2, 4)(7)
The fixed element in this Josephus permutation is:
7
n = 8, f = 4, m = 4: Object 6 was selected last!
There is 1 fixed element: 7.
--------------------
-Harry
Function keys -
The function keys described here or used on the Run form.
F1 => Display Help form.
F2 => Quit the Run form and go back to the Startup form:
If a calculation is running, indicated by the word **Running** displayed on the
Run form, when F2 is pressed, it is treated as an Abort Calc. request, with the
message:
When **Running**, select Quit twice to quit
F5 => Get Status of calculation:
Press the F5 key while a computation is being performed and a message like
Orbits: Percent done, Memory in use = , DT = sec.
will be displayed in the output text box. This is the same as the "Status of
Calc." command button.
F6 => Display Configuration form:
Press the F6 key and the Configuration form will appear. F6 is the same as the
"Configuration" command button.
F7 => Outputs a simple permutation report:
Press the F7 key and a simple permutation report will be output. For example:
n = 100, m = 2, f = 1: Object 72 was selected last!
There is 1 fixed element: 1.
F7 is the same as the "Report" command button.
F8 => Outputs a detailed permutation report:
Press the F8 key and a detailed permutation report will be output. For example:
Execution order, when object i was selected:
1 51 2 76 3 52 4 99 5 53 6 77 7 54 8 89 9 55 10 78 11 56 12 95 13 57 14 79 15 58
16 90 17 59 18 80 19 60 20 98 21 61 22 81 23 62 24 91 25 63 26 82 27 64 28 96 2
9 65 30 83 31 66 32 92 33 67 34 84 35 68 36 100 37 69 38 85 39 70 40 93 41 71 42
86 43 72 44 97 45 73 46 87 47 74 48 94 49 75 50 88
Order of execution, object # selected on k'th selection:
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 5
7 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 2 6 10 14 18 22
26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 4 12 20 28 36 44 52 60
68 76 84 92 100 16 32 48 64 80 96 24 56 88 40 8 72
The resulting permutation expressed in cyclic notation:
(1)(51, 26, 57, 29, 15, 8, 99, 50, 63, 32, 90, 73, 37, 19, 10, 53, 27, 14, 54, 6
4, 92, 87, 44, 81, 41, 21, 11, 6, 52, 82, 71, 36, 80, 93, 47, 24, 95, 48, 91, 46
, 62, 66, 67, 34, 59, 30, 58, 65, 33, 17, 9, 5, 3, 2)(76, 85, 43, 22, 56, 96, 94
, 74, 69, 35, 18, 55, 28, 79, 40, 98, 75, 38, 60, 83, 42, 61, 31, 16, 89, 45, 23
, 12, 77, 39, 20, 78, 70, 68, 84, 86, 72, 100, 88, 97, 49, 25, 13, 7, 4)
The fixed element in this Josephus permutation is:
1
n = 100, m = 2, f = 1: Object 72 was selected last!
There is 1 fixed element: 1.
F8 is the same as the "Report All" command button.
F9 => Toggle Logging to Log file on/off:
If the "Logging screen to log file mode is off it will be turned on, if on it
will be turned off. F9 is the same as the "Logging is On/Off" command button.
F11 => Clear output text box:
This clears the output text box. F11 is the same as the "Clear Output" command
button.
F12 => Brings up the Plot form and plots:
If the Plot form is not up, this causes the Plot form to come up and to plot the
currently defined permutation. F12 is the same as the "Plot" command button.
Ctrl+F9 => Clear Log File:
This clears the log file and writes a header message in it.
ESC => Interrupt/Abort a long process:
The ESC key from the Run form while a calculation is running is the same as the
"Abort Calc" command button. It can be used after the program has been asked to
perform a task that is taking longer than the operator is willing to wait.
One of the messages:
Manually aborted before Orbits finished
Manually aborted before report finished
will appear. The first one appears if we were in the process of computing orbits
of the permutation. The second appears if we were in the process of giving a
detailed report of the permutation.
Command buttons -
There are 10 command buttons on the Run form:
Abort Calc.: Same as ESC key.
Status of Calc.: Same as F5 key.
Configuration: Same as F6 key.
Report: Same as F7 key.
Report All: Same as F8 key.
Plot: Same as F12 key.
Quit: Quit the Run form and go back to the Startup form. Same as F2 key
Clear Log File: Clears the log file, same as Ctrl+F9 key.
Logging Is On/Off: Same as F9 key.
Clear Output: Same as F11 key.
If the Quit button, File menu Exit, the Run form's Close button Alt+F4, or Upper
right hand X button is selected when a calculation is running, indicated by
**Running** being displayed on the Run form, the calculation is automatically
aborted. The message
When **Running**, select Quit twice to quit
is displayed in the text output text box and a second quit request is required
to quit.
If a calculation is not running, the File menu Exit, the Run form's Close button
Alt+F4, or Upper right hand X button will totally end the program without
stopping at the Startup form. The Quit button or F2 will close all open forms
and return to the Startup form with the previously selected parameters.
The Run form has a File and a Help menu button. The File menu has
Exit. The Help menu has Help form and About...
Exit is the same as the Quit button except it does a complete exit.
Help form is the same as the F1 key and causes the Help form to be displayed.
About will bring up a dialog box with Application Title, Version, Application
Description and a URL to obtain the latest version of the program:
Click the OK button, press Enter, or hit the escape button to remove this box.
Click the Plot button and the Plot form is displayed and the currently selected
permutation is plotted.
Plot form -
This is an example of the plot form plotting the case of n = 100, f = 1, and m =
2.
Object n is plotted at the very top of the circle. Object 1 is the next point to
the right clockwise.
The red lines are drawn from each item in the original circle to where it ends
up in the new circle. The extra part of the line outside of the circle shows
that it is a point on the new circle. Some plots may have a small extra part of
the line outside of the circle that should be ignored.
If n is greater than Max Points Plotted (selectable on the Startup Frame), only
the first Max Points Plotted points will be plotted.
The "Number n", "First f", and "Skip m" all work the same. To change one of
these, edit its value in the TextBox and press Enter or click the "Change It"
button. If the edited value is unacceptable, the "Change It" button will be
disabled and the value will not change. If you clear the TextBox and try to
accept it, the current value will be displayed in the TextBox.
If you click the "-1" button under the "Change It" button and the current value
is greater than 1, the current value will be reduced by one, the value in the
TextBox will be updated and a new plot will be generated.
If you click the "+1" button under the "Change It" button and the current value
is less than Max Number n, the current value will be increased by one, the value
in the TextBox will be updated and a new plot will be generated.
If you click the "Plot" button, a new plot will be generated with the current
values of n, f, and m.
The "About" button, will bring up a dialog box with Application Title, Version,
Application Description and a URL to obtain the latest version of the program.
The "Exit" button will terminate the current plot calculation if any, close the
Plot form and go to the Run form.
Messages and error reports -
There are several different messages and/or error reports that are a result of
user action (or conceivably an error in the JosephusCS program):
JosephusCS - The Flavius Josephus Permutation Program, C# Version 2.1.xxxx.xxxxx
Run on: by
Output Screen: Cleared mm/dd/yyyy hh:mm:ss am/pm
Orbits: Percent done, Memory in use = , DT = sec.
Manually aborted before Orbits finished
Manually aborted before report finished
When **Running**, select Quit twice to quit
Log file Opened for Append mm/dd/yyyy hh:mm:ss am/pm
Full name = \
Log file Closed mm/dd/yyyy hh:mm:ss am/pm
File opened for writing
Full name = \
Writing file
Log file Cleared mm/dd/yyyy hh:mm:ss am/pm
Full name = \
File JosephusCSHelp.txt opened for reading
Full name = \JosephusCSHelp.txt
Cannot open file JosephusCSHelp.txt for input
Not in current directory
OpenRead: Could not find file \JosephusCSHelp.txt'.
Cannot open for output
Full name = \
OpenAppend: Access to the path '\' is denied.
Aborting file write...
Cannot open for output
Full name = \
OpenWrite: Access to the path '\' is denied.
I/O operation aborted by operator!
Aborting file write...
Other forms -
Other forms that can be displayed to help in using the program are the Startup,
Help, Configuration, Change File Path/Browse For Folder, Select a File, and Plot
forms. On all forms except the Run form, pressing the ESC key will remove the
form.
Startup form -
The Startup form is shown above and has five parameters that can be set before
the program runs:
"Max Number n <= 1000000" can be set to a value from 1 to 1000000 and it can
only be changed on this Startup form. The nominal starting value is 1000. Number
n cannot be set larger than this.
"Number n" can be set to a value from 1 to Max Number n. The nominal starting
value is 100 and it can be changed on the Plot form. n = The number of objects
in the circle.
"First f" can be set to a value from 1 to 1000000. The nominal starting value
is 1 and it can be changed on the Plot form. f = index of first object to be
selected [1, n].
"Skip m" can be set to a value from 1 to 1000000. The nominal starting value is
2 and it can be changed on the Plot form. m = difference in index of items
selected, m = 2 => every other item.
"Max Pointed Plotted" can be set to a value from 1 to 1000000. The nominal
starting value is 200 and it can only be changed on this Startup form. Large
values of this parameter can cause the Plot form to take a very long time before
the plot appears and the program may have to be terminated manually by clicking
the X in the upper right hand corner of the Plot form or the Run form. If n is
greater than Max Points Plotted, only the first Max Points Plotted points will
be plotted.
These five values are tested as they are edited. Zeros on the left or spaces on
the left or right are removed so you will not see them. These numbers are
displayed in bold face font iff they are acceptable values. If any of the five
values are unacceptable, the Run button is disabled.
A "Default Settings" button is provided to reset the five parameters to their
original values.
The Run button is used to bring up the Run form. It can be used after a Run form
exits to reinitialize JosephusCS and start running again. The Exit button will
terminate the program.
Help form -
The Help form was shown and partially described above. It has a File menu button
that has a menu with Print Setup, Print..., Print Preview and Exit. The Print
Setup will bring up the Windows printer setup dialog box so you can select the
printer to use. The Print... will start the printing process to start printing
the help file. This will normally bring up the printers dialog box. The Print
Preview does just that, it can also be used for printing. The Exit does the same
thing as pressing the escape key; the Help form is removed.
This form also has a "F3 Find:" button, a "F2 Up" button and a small text box
for entering a string of characters to find. Pressing F3 is the same as clicking
the "F3 Find:" button, the text in the small text box is searched for. Pressing
F2 is the same as clicking the "F2 Up" button, same as F3 except the search is
done from the current location towards the top of the large text box.
If during a find the text is not found, the sound from NotFound.wav is heard. If
it is found, but only by starting over from the other end of the text, the sound
from Wrap.wav is heard. This sound process uses the system file winmm.dll. If
that file cannot be found, there will be no sound.
A short beep is also heard when the text is found. The beep is 277Hz = middle C#
for a normal search and 554Hz one octave above for a search up. The beep process
uses the system file kernel32.dll. If that file cannot be found, there will be
no beep.
Text can be copied from the large text box to the small text box by selecting
the text with the left mouse button and pressing Ctrl-F.
The Help form is unique in that more than one copy can be brought up at the same
time. This may or not be useful, but it illustrates a technique in Windows
programming.
Configuration form -
The Configuration form is displayed when function key F6 is pressed or the
"Configuration" command button is selected on the Run form:
This form allows you to change:
Log to file mode.
Name of Log file.
It also shows the Home Directory, File path, and the name of the log file if Log
to file mode is on. The Browse For Folder form can be brought up by selecting
the "Change File Path" command button, and the Select a file form can be brought
up by selecting "Select a File" command button.
Clicking the "Change It" button when its text box is empty will bring up the
current value. It can be edited, and a second click with the text box not empty
will accept the entry. A space at the right or a Return/Enter key will also
accept it.
The Log to file mode can be changed/toggled by clinking the corresponding
button. If the mode is on, the button will says "Is On", then clicking it will
turn the mode off and the button will change to "Is Off". If the mode is off,
the button will says "Is Off", then clicking it will turn the mode on and the
button will change to "Is On".
The Log to file mode and name of Log file interact in that if the file name is
changed while a log file is open, the file name of the open file will not change
until the log file is closed and reopened.
Browse For Folder form -
The Browse For Folder form is displayed when the "Change File Path" command
button is selected on the Configuration form:
To change the current directory to be used for the Log file, use this form to
select a path. This form is resizable as is the Run, Help, and Select a file
forms.
Select a File form -
The Select a file form is displayed when the "Select a File" command button is
selected on the Configuration form:
This provides a way to browse and select a file. If a file is selected, it can
then be used to set a file name on the Configuration form by clicking the file
name "Change It" buttons. The first click enters the file name in the text box
and a second click will accept it. This form can also be used to change the file
path.
The list box in the lower right hand corner of the Configuration form is a list
of the files in the currently selected file path. The wild card selection for
these files (*.log, or *.*) is the same as last used on the Select a file form.
How things are computed -
int[] a; // Working array of objects
// Ends up with a[i] = when object i was selected
int[] b; // Record of objects selected
// Ends up with b[i] = object # selected on k'th selection
int c; // Index to current object being scanned
int f; // # of first object to be selected
int i; // Utility index
int k; // Number of objects selected (killed) so far
int m; // m for selecting every m'th object
int n; // The total number of objects in the circle to start with
int p; // Index to previous object
int r; // Remaining number of objects in the circle
int s; // Number of fixed (stationary) elements in permutation
int maxS; // Up to maxS saved fixed elements (maxS = 10)
int[] x; // Saved fixed elements
void Orbits() // Determine the orbits
// uses n, f, and m as input
// computes a[], b[], and s
{
for (i = 1; i < n; i++)
a[i] = i+1; // Set position i to point to next position
a[n] = 1;
p = 1 + ((f % n) + n - 2) % n; // Init previous position based on f
k = 1; r = n;
do
{
if ((1 < k) && (k < n)) // If not first or last selection
{
for (i = 1; i <= (m - 1) % r; i++) // Move m-1 positions (zero OK)
p = a[p];
}
c = a[p]; // Update current position
b[k] = c; c = a[c]; // Select the object at c
a[a[p]] = k; // Save execution order
k++; r--;
a[p] = c; // Re-link circular chain of pointers
} while (k <= n); // Until all are selected
a[c] = n; // a[c] was clobbered, so restore it
s = 0; // Count number of fixed elements
for (i = 1; i <= n; i++)
if (b[i] == i)
s++;
} // Orbits
void ReportDetails() // Generate detailed output
// uses n, a[], and b[] as input
{
WriteLn("Execution order, when object i was selected:");
for (i = 1; i <= n; i++)
Write(a[i] + " ");
WriteLn(); WriteLn();
WriteLn("Order of execution, object # selected on k'th selection:");
for (i = 1; i <= n; i++)
Write(b[i] + " ");
WriteLn(); WriteLn();
WriteLn("The resulting permutation expressed in cyclic notation:");
p = b[1]; c = 1;
int[] t = new int[n + 1]; // temporary working array of objects
for (i = 1; i <= n; i++) t[i] = a[i];
do
{
Write("(");
do
{
if (c != 0)
{
Write("" + c);
t[p] = 0; p = c;
}
c = t[p];
if (c != 0) Write(", ");
} while (c != 0);
Write(")");
i = 0;
do
{
i++; c = t[i];
}
while ((c == 0) && (i != n));
if (c != 0) p = b[c];
} while (c != 0);
WriteLn(); WriteLn();
ReportFixed();
} // ReportDetails
void ReportFixed() // Generate output of all fixed elements
// uses n, s, and b[] as input
{
string Ss; // String "s" or "" if s = 1
string Sis; // String "are" or "is" if s = 1 }
if (s == 1) // Setup is or are
{
Ss = ""; Sis = "is";
}
else
{
Ss = "s"; Sis = "are";
}
Common.WriteLn("The fixed element" + Ss + " in this Josephus permutation " +
Sis + ":");
for (i = 1; i <= n; i++)
{
if (b[i] == i) // Output fixed elements
Common.Write(i + " ");
}
if (s == 0) Common.Write("None!");
Common.WriteLn();
Common.WriteLn();
} // ReportFixed
void ReportResults() // Generate normal output
// uses n, f, m, s, maxS, b[], and x[] as input
{
GenerateFixed();
int nx = 0; // Number of saves fixed elements
string Ss; // String "s" or "" if s = 1
string Sis; // String "are" or "is" if s = 1 }
if (s == 1) // Setup is or are
{
Ss = ""; Sis = "is";
}
else
{
Ss = "s"; Sis = "are";
}
Common.Write("n = " + n + ", m = " + m + ", f = " + f);
if (f > n) Common.Write(" => " + 1 + (f - 1) % n);
Common.WriteLn(": Object " + b[n] + " was selected last!");
Common.Write("There " + Sis + " " + s + " fixed element" + Ss);
if (s > 0)
{
nx = s;
if (nx > maxS) nx = maxS;
Common.Write(": ");
for (i = 1; i <= nx; i++)
{
Common.Write("" + x[i]);
if (i != nx) Common.Write(", ");
}
}
if (s > nx) Common.Write(", ... ");
Common.WriteLn("."); Common.WriteLn();
} // ReportResults
GenerateFixed() // Generate array of first fixed elements
// uses n, maxS, and b[] as input
// computes x[]
{
Int sl = 0; // number of fixed elements found
for (i = 1; i <= n; i++)
{
if (b[i] == i)
{
sl++;
if (sl <= maxS)
x[sl] = i; // Save up to maxS fixed elements
else
return;
}
}
} // GenerateFixed
Distribution files -
The distribution files can be downloaded from my website:
http://www.oocities.org/hjsmithh/
in the Files to Download section
http://www.oocities.org/hjsmithh/download.html#Joseph .
When you install the program using the distribution file JosephusCS21?.exe or
JosephusCS21?.zip, a folder is created with 3 subfolders:
+--JosephusCS 2.1
¦ +--doc
¦ +--run
¦ +--src
The main folder has two files sseexec.dat and SSEun.dat. These are needed to be
able to uninstall the program
The doc subfolder has the following 4 files:
00.txt (A short list of features)
Fixes.txt (A list of features and fixes added to each version)
JosephusCS.doc (Microsoft Word file)
JosephusCS.txt (Plain ASCII text copy of the .doc file without graphics)
There is also available on my website a copy of the .doc file in an Adobe
Acrobat Reader file JosephusCS.pdf.
http://www.oocities.org/hjsmithh/Josephus/index.html .
The run subfolder has the following 7 files
00.txt
JosephusCS.exe
JosephusCS.log
JosephusCSHelp.txt
Log.log
NotFound.wav
Wrap.wav
The .exe file is executed from there.
The src subfolder has all the source files needed for development:
00Note.txt
AboutForm.cs
AboutForm.resx
AssemblyInfo.cs
Common.cs
ConfigEdit.ico
ConfigForm.cs
ConfigForm.resx
COPYING.txt
cs.ico
Global.cs
harry.jpg
HelpForm.cs
HelpForm.resx
JosephusCS.cs
JosephusCS.csproj
JosephusCS.ico
JosephusCS.sln
JosephusCS.suo
JosephusCS.csproj.user
PlotControl.cs
PlotControl.resx
PlotForm.cs
PlotForm.resx
RunForm.cs
RunForm.resx
StartupForm.cs
StartupForm.resx
The end -
Report any errors by sending me a letter, an e-mail or call me at my home phone.
-Harry
Harry J. Smith
19628 Via Monte Dr.
Saratoga, CA 95070-4522, USA
Home Phone: 1 408 741-0406
E-mail: hjsmithh@sbcglobal.net
Website: http://www.oocities.org/hjsmithh/