예제 #1
0
        private static SixJSymbol[] GenerateRandomSixJSymbols(double j_max, int n)
        {
            int tj_max = (int)Math.Truncate(2.0 * j_max);

            SixJSymbol[] symbols = new SixJSymbol[n];
            Random       rng     = new Random(1);

            int i = 0;

            while (i < n)
            {
                //for (int i = 0; i < n; i++) {

                // pick 1, 4, and 2 randomly
                int tj1 = rng.Next(tj_max + 1);
                int tj4 = rng.Next(tj_max + 1);
                int tj2 = rng.Next(tj_max + 1);

                // make sure 5 has appropriate wholess so that 1+2 has same wholeness as 4+5
                int tj5 = rng.Next(tj_max + 1);
                if (((tj1 + tj2) % 2) != ((tj4 + tj5) % 2))
                {
                    tj5++;
                }

                // make sure 3 can be formed from 1+2 or 4+5

                int tj12_min = Math.Abs(tj1 - tj2);
                int tj45_min = Math.Abs(tj4 - tj5);
                int tj3_min;
                if (tj12_min > tj45_min)
                {
                    tj3_min = tj12_min;
                }
                else
                {
                    tj3_min = tj45_min;
                }

                int tj12_max = tj1 + tj2;
                int tj45_max = tj4 + tj5;
                int tj3_max;
                if (tj12_max < tj45_max)
                {
                    tj3_max = tj12_max;
                }
                else
                {
                    tj3_max = tj45_max;
                }

                if (tj3_min > tj3_max)
                {
                    continue;
                }

                int tj3 = tj3_min + 2 * rng.Next((tj3_max - tj3_min) / 2 + 1);

                // make sure 6 can be formed from 1+5 or 4+2

                int tj15_min = Math.Abs(tj1 - tj5);
                int tj42_min = Math.Abs(tj4 - tj2);
                int tj6_min;
                if (tj15_min > tj42_min)
                {
                    tj6_min = tj15_min;
                }
                else
                {
                    tj6_min = tj42_min;
                }

                int tj15_max = tj1 + tj5;
                int tj42_max = tj4 + tj2;
                int tj6_max;
                if (tj15_max < tj42_max)
                {
                    tj6_max = tj15_max;
                }
                else
                {
                    tj6_max = tj42_max;
                }

                if (tj6_min > tj6_max)
                {
                    continue;
                }

                int tj6 = tj6_min + 2 * rng.Next((tj6_max - tj6_min) / 2 + 1);

                // make the symbol
                SixJSymbol symbol = new SixJSymbol();
                symbol.J1 = new Spin(tj1 / 2.0);
                symbol.J2 = new Spin(tj2 / 2.0);
                symbol.J3 = new Spin(tj3 / 2.0);
                symbol.J4 = new Spin(tj4 / 2.0);
                symbol.J5 = new Spin(tj5 / 2.0);
                symbol.J6 = new Spin(tj6 / 2.0);

                symbols[i] = symbol;
                i++;
            }

            return(symbols);
        }
예제 #2
0
        private static SixJSymbol[] GenerateRandomSixJSymbols(double j_max, int n)
        {
            int tj_max = (int) Math.Truncate(2.0 * j_max);

            SixJSymbol[] symbols = new SixJSymbol[n];
            Random rng = new Random(1);

            int i = 0;
            while (i < n) {
            //for (int i = 0; i < n; i++) {

                // pick 1, 4, and 2 randomly
                int tj1 = rng.Next(tj_max + 1);
                int tj4 = rng.Next(tj_max + 1);
                int tj2 = rng.Next(tj_max + 1);

                // make sure 5 has appropriate wholess so that 1+2 has same wholeness as 4+5
                int tj5 = rng.Next(tj_max + 1);
                if (((tj1 + tj2) % 2) != ((tj4 + tj5) % 2)) tj5++;

                // make sure 3 can be formed from 1+2 or 4+5

                int tj12_min = Math.Abs(tj1 - tj2);
                int tj45_min = Math.Abs(tj4 - tj5);
                int tj3_min;
                if (tj12_min > tj45_min) {
                    tj3_min = tj12_min;
                } else {
                    tj3_min = tj45_min;
                }

                int tj12_max = tj1 + tj2;
                int tj45_max = tj4 + tj5;
                int tj3_max;
                if (tj12_max < tj45_max) {
                    tj3_max = tj12_max;
                } else {
                    tj3_max = tj45_max;
                }

                if (tj3_min > tj3_max) continue;

                int tj3 = tj3_min + 2 * rng.Next((tj3_max - tj3_min) / 2 + 1);

                // make sure 6 can be formed from 1+5 or 4+2

                int tj15_min = Math.Abs(tj1 - tj5);
                int tj42_min = Math.Abs(tj4 - tj2);
                int tj6_min;
                if (tj15_min > tj42_min) {
                    tj6_min = tj15_min;
                } else {
                    tj6_min = tj42_min;
                }

                int tj15_max = tj1 + tj5;
                int tj42_max = tj4 + tj2;
                int tj6_max;
                if (tj15_max < tj42_max) {
                    tj6_max = tj15_max;
                } else {
                    tj6_max = tj42_max;
                }

                if (tj6_min > tj6_max) continue;

                int tj6 = tj6_min + 2 * rng.Next((tj6_max - tj6_min) / 2 + 1);

                // make the symbol
                SixJSymbol symbol = new SixJSymbol();
                symbol.J1 = new Spin(tj1 / 2.0);
                symbol.J2 = new Spin(tj2 / 2.0);
                symbol.J3 = new Spin(tj3 / 2.0);
                symbol.J4 = new Spin(tj4 / 2.0);
                symbol.J5 = new Spin(tj5 / 2.0);
                symbol.J6 = new Spin(tj6 / 2.0);

                symbols[i] = symbol;
                i++;

            }

            return (symbols);
        }