Changeset 8410


Ignore:
Timestamp:
Oct 16, 2019, 4:00:46 PM (2 years ago)
Author:
kopal
Message:
  • Random Number Generator

added "subtractive generator"

Location:
trunk/CrypPlugins/RandomNumberGenerator
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/RandomNumberGenerator/LCG.cs

    r7451 r8410  
    7474        public override void randomize()
    7575        {
    76             RandNo= (A * RandNo + B) % Modulus;
     76            RandNo = (A * RandNo + B) % Modulus;
    7777        }
    7878    }
  • trunk/CrypPlugins/RandomNumberGenerator/RandomNumberGenerator.cs

    r8109 r8410  
    2626using Cryptool.PluginBase.IO;
    2727using System.Security.Cryptography;
     28using RandomNumberGenerator;
    2829
    2930namespace Cryptool.Plugins.RandomNumberGenerator
     
    110111                    executedWithoutError = ExecuteICG();
    111112                    break;
     113                case AlgorithmType.SubtractiveGenerator:
     114                    executedWithoutError = ExecuteXpat2();
     115                    break;
    112116                default:
    113117                    throw new Exception(String.Format("Algorithm type {0} not implemented", _Settings.AlgorithmType.ToString()));
     
    118122                ProgressChanged(1, 1);
    119123            }
    120         }
     124        }     
    121125
    122126        /// <summary>
     
    748752        }
    749753
     754        private bool ExecuteXpat2()
     755        {
     756            BigInteger seed;
     757            int outputlength;
     758            try
     759            {
     760                seed = BigInteger.Parse(_Settings.Seed);
     761            }
     762            catch (Exception)
     763            {
     764                GuiLogMessage(String.Format(Resources.InvalidSeedValue, _Settings.Seed), NotificationLevel.Error);
     765                return false;
     766            }           
     767            if (String.IsNullOrEmpty(_Settings.OutputLength))
     768            {
     769                outputlength = 0;
     770            }
     771            else
     772            {
     773                try
     774                {
     775                    outputlength = int.Parse(_Settings.OutputLength);
     776                }
     777                catch (Exception)
     778                {
     779                    GuiLogMessage(String.Format(Resources.InvalidOutputLength, _Settings.Modulus), NotificationLevel.Error);
     780                    return false;
     781                }
     782            }
     783         
     784            switch (_Settings.OutputType)
     785            {
     786                case OutputType.ByteArray:
     787                    {
     788                        SubtractiveGenerator xpat2Generator = new SubtractiveGenerator(seed, outputlength);
     789                        _output = xpat2Generator.generateRNDNums();
     790                        OnPropertyChanged("Output");
     791                    }
     792                    break;
     793                case OutputType.CrypToolStream:
     794                    {
     795                        SubtractiveGenerator icgGenerator = new SubtractiveGenerator(seed, outputlength);
     796                        byte[] output = icgGenerator.generateRNDNums();
     797                        _output = new CStreamWriter(output);
     798                        OnPropertyChanged("Output");
     799                    }
     800                    break;
     801                case OutputType.Number:
     802                    {
     803                        SubtractiveGenerator xpat2Generator = new SubtractiveGenerator(seed, outputlength);
     804                        byte[] output = xpat2Generator.generateRNDNums();
     805                        OnPropertyChanged("Output");
     806                        _output = new CStreamWriter(output);
     807                        if (output.Length > 0)
     808                        {
     809                            output[output.Length - 1] &= (byte)0x7F; // set sign bit 0 = positive
     810                        }
     811                        _output = new BigInteger(output);
     812                        OnPropertyChanged("Output");
     813                    }
     814                    break;
     815                case OutputType.NumberArray:
     816                    {
     817                        int outputamount;
     818                        if (String.IsNullOrEmpty(_Settings.OutputAmount))
     819                        {
     820                            outputamount = 1;
     821                        }
     822                        else
     823                        {
     824                            try
     825                            {
     826                                outputamount = int.Parse(_Settings.OutputAmount);
     827                            }
     828                            catch (Exception)
     829                            {
     830                                GuiLogMessage(String.Format(Resources.InvalidOutputAmount, _Settings.Modulus), NotificationLevel.Error);
     831                                return false;
     832                            }
     833                        }
     834                        BigInteger[] array = new BigInteger[outputamount];
     835                        SubtractiveGenerator xpat2Generator = new SubtractiveGenerator(seed, outputlength);
     836                        for (int i = 0; i < outputamount; i++)
     837                        {
     838                            byte[] output = xpat2Generator.generateRNDNums();
     839                            if (output.Length > 0)
     840                            {
     841                                output[output.Length - 1] &= (byte)0x7F; // set sign bit 0 = positive
     842                            }
     843                            array[i] = new BigInteger(output);
     844                        }
     845                        _output = array;
     846                        OnPropertyChanged("Output");
     847                    }
     848                    break;
     849                case OutputType.Bool:
     850                    {
     851                        SubtractiveGenerator xpat2Generator = new SubtractiveGenerator(seed, outputlength);
     852                        _output = xpat2Generator.randBit() == 0;
     853                        OnPropertyChanged("Output");
     854                    }
     855                    break;
     856                default:
     857                    throw new Exception(String.Format("Output type {0} not implemented", _Settings.OutputType.ToString()));
     858            }
     859            return true;
     860        }
     861
    750862        /// <summary>
    751863        /// Called once after workflow execution has stopped.
  • trunk/CrypPlugins/RandomNumberGenerator/RandomNumberGenerator.csproj

    r8187 r8410  
    130130      <DesignTime>True</DesignTime>
    131131    </Compile>
     132    <Compile Include="SubtractiveGenerator.cs" />
    132133    <Compile Include="X2.cs" />
    133134  </ItemGroup>
  • trunk/CrypPlugins/RandomNumberGenerator/RandomNumberGeneratorSettings.cs

    r8109 r8410  
    3737        X2modN = 2,
    3838        LCG = 3,
    39         ICG = 4
     39        ICG = 4,
     40        SubtractiveGenerator = 5
    4041    }
    4142
     
    7980        #region TaskPane Settings
    8081
    81         [TaskPane("AlgorithmTypeCaption", "AlgorithmTypeTooltip", "GeneralSettingsGroup", 0, false, ControlType.ComboBox, new string[] { "Random.Random", "RNGCryptoServiceProvider", "X^2 mod N", "LCG", "ICG" })]
     82        [TaskPane("AlgorithmTypeCaption", "AlgorithmTypeTooltip", "GeneralSettingsGroup", 0, false, ControlType.ComboBox, new string[] { "Random.Random", "RNGCryptoServiceProvider", "X^2 mod N", "LCG", "ICG", "Subtractive Generator" })]
    8283        public AlgorithmType AlgorithmType
    8384        {
     
    225226            _settingsVisibility[AlgorithmType.LCG].Add("a");
    226227            _settingsVisibility[AlgorithmType.LCG].Add("b");
     228            _settingsVisibility[AlgorithmType.SubtractiveGenerator].Add("Seed");
    227229            UpdateTaskPaneVisibility();
    228230        }
  • trunk/CrypPlugins/RandomNumberGenerator/userdoc.xml

    r7931 r8410  
    4747        Note that the quality of the ICG depends decisively on the choice of parameters. An important measure here is the period length of the random sequence, which is defined by the parameters.
    4848    </section>
     49    <section headline="Subtractive Generator">
     50      The generator calculates a sequence of random numbers, where each number is congruent to the subtraction of two previous numbers from the sequence.
     51      Its code is based on the implementation of the rosetta stone webpage, see <ref id="SubtractiveGenerator" /> for details.
     52    </section>
    4953  </introduction>
    5054  <introduction lang = "ru">
     
    9195    Обратите внимание, что качество МКГ зависит от выбора параметров. Важной мерой здесь является длина периода случайной последовательности, которая определяется параметрами.
    9296  </section>
     97    <section headline="Subtractive Generator">
     98      Генератор вычисляет последовательность случайных чисел, где каждое число совпадает с вычитанием двух предыдущих чисел из последовательности.
     99      Его код основан на реализации веб-страницы «Розеттский камень», подробности смотрите в <ref id = "SubtractiveGenerator" />.
     100    </section>
    93101  </introduction>
    94102  <introduction lang="de-DE">
     
    134142        Parameter beim ICG sind die Zahlen P, a, c der modulo P Invertierung der Geraden-Gleichung y = ax+c: Der Modul P ist eine Primzahl, der Multiplikator a: 0&lt;a&lt;N und das additive Inkrement b: 1&lt;b&lt;N. Des weiteren wird der ICG durch den geheimen Initialwert oder Saat X_0 initialisiert.<newline /><newline />
    135143        Beachten Sie, dass die Qualität des ICG entscheidend von der Wahl der Parameter abhängt. Ein wichtiges Maß ist hierbei die Periodenlänge der Zufallsfolge, die durch die Parameter festgelegt wird.
    136     </section></introduction>
     144    </section>
     145    <section headline="Subtractive Generator">
     146      Der Generator berechnet eine Folge von Zufallszahlen, wobei jede Zahl zur Subtraktion von zwei vorhergehenden Zahlen der Folge kongruent ist.
     147      Der Code basiert auf der Implementierung der Rosetta Stone-Webseite. Weitere Informationen finden Sie unter <ref id = "SubtractiveGenerator" />.
     148    </section>
     149  </introduction>
    137150  <usage lang="en">
    138151  The algorithm is selected via the configuration. Depending on the pseudorandom generator used, different parameters are used. These are assigned values via the entries.
     
    179192      <link url="https://ru.wikipedia.org/wiki/Инверсный_конгруэнтный_метод" lang="ru" />
    180193      <caption lang="ru">Инверсный конгруэнтный метод</caption>
    181     </linkReference>   
     194    </linkReference>
     195    <linkReference id="SubtractiveGenerator">
     196      <link url="https://rosettacode.org/wiki/Subtractive_generator" lang="en" />
     197      <caption lang="en">Subtractive generator</caption>
     198      <link url="https://rosettacode.org/wiki/Subtractive_generator" lang="de-DE" />
     199      <caption lang="de-DE">Subtractive generator</caption>
     200      <link url="https://rosettacode.org/wiki/Subtractive_generator" lang="ru" />
     201      <caption lang="ru">Subtractive generator</caption>
     202    </linkReference>
    182203  </references>
    183204</documentation>
Note: See TracChangeset for help on using the changeset viewer.