Changeset 8673


Ignore:
Timestamp:
Feb 24, 2020, 3:40:37 PM (2 years ago)
Author:
kopal
Message:

NumberOperations:

  • implemented documented but previously non-implemented math functions
Location:
trunk/CrypPlugins/Numbers
Files:
7 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/Numbers/NumberOperations.cs

    r8109 r8673  
    2424{
    2525    [Author("Sven Rech, Nils Kopal", "sven.rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
    26     [PluginInfo("Cryptool.Plugins.Numbers.Properties.Resources", "PluginOperationCaption", "PluginOperationTooltip", "Numbers/DetailedDescription/doc.xml", "Numbers/icons/plusIcon.png", "Numbers/icons/minusIcon.png", "Numbers/icons/timesIcon.png", "Numbers/icons/divIcon.png", "Numbers/icons/powIcon.png", "Numbers/icons/gcdicon.png", "Numbers/icons/lcmIcon.png", "Numbers/icons/rootIcon.png", "Numbers/icons/inverseIcon.png", "Numbers/icons/phiIcon.png")]
     26    [PluginInfo("Cryptool.Plugins.Numbers.Properties.Resources", "PluginOperationCaption", "PluginOperationTooltip",
     27        "Numbers/DetailedDescription/doc.xml",
     28        "Numbers/icons/plusIcon.png",
     29        "Numbers/icons/minusIcon.png",
     30        "Numbers/icons/timesIcon.png",
     31        "Numbers/icons/divIcon.png",
     32        "Numbers/icons/powIcon.png",
     33        "Numbers/icons/gcdicon.png",
     34        "Numbers/icons/lcmIcon.png",
     35        "Numbers/icons/rootIcon.png",
     36        "Numbers/icons/inverseIcon.png",
     37        "Numbers/icons/phiIcon.png",
     38        "Numbers/icons/divsumIcon.png",
     39        "Numbers/icons/divnumIcon.png",
     40        "Numbers/icons/PiIcon.png",
     41        "Numbers/icons/PrimeNIcon.png",
     42        "Numbers/icons/NextPrimeIcon.png",
     43        "Numbers/icons/PrevOrimeIcon.png",
     44        "Numbers/icons/IsPrime.png")]
    2745    [ComponentCategory(ComponentCategory.ToolsMisc)]
    2846    class NumberOperations : ICrypComponent
     
    3654        private BigInteger output = 0;
    3755        private NumberSettings settings = new NumberSettings();
     56        private bool _running = false;
    3857
    3958        #endregion
     
    160179        {
    161180            BigInteger result = 0;
     181            _running = true;
    162182
    163183            //First checks if both inputs are set
    164             if (input1 != null && input2 != null)
     184            if (input1 != null)
    165185            {
    166186                ProgressChanged(0.5, 1.0);
     
    171191                    switch (settings.Operat)
    172192                    {
    173                         // x + y
    174                         case 0:
     193                        case NumberOperation.Addition:
    175194                            result = Input1 + Input2;
    176195                            break;
    177                         // x - y
    178                         case 1:
     196                        case NumberOperation.Subtraction:
    179197                            result = Input1 - Input2;
    180198                            break;
    181                         //x * y
    182                         case 2:
     199                        case NumberOperation.Multiplication:
    183200                            result = Input1 * Input2;
    184201                            break;
    185                         // x / y
    186                         case 3:
     202                        case NumberOperation.Division:
    187203                            result = Input1 / Input2;
    188204                            break;
    189                         // x ^ y
    190                         case 4:
     205                        case NumberOperation.Power:
    191206                            if (Mod != 0)
    192207                            {
     
    201216                            }
    202217                            break;
    203                         // gcd(x,y)
    204                         case 5:
     218                        case NumberOperation.GCD:
    205219                            result = Input1.GCD(Input2);
    206220                            break;
    207                         // lcm(x,y)
    208                         case 6:
     221                        case NumberOperation.LCM:
    209222                            result = Input1.LCM(Input2);
    210223                            break;
    211                         // sqrt(x,y)
    212                         case 7:
     224                        case NumberOperation.SQRT:
    213225                            result = Input1.Sqrt();
    214226                            break;
    215                         // modinv(x,y)
    216                         case 8:
     227                        case NumberOperation.MODINV:
    217228                            if (Input2 != 0)
    218229                            {
     
    224235                            }
    225236                            break;
    226                         // phi(x)
    227                         case 9:
     237                        case NumberOperation.Phi:
    228238                            result = Input1.Phi();
    229239                            break;
     240                        case NumberOperation.Divsum:
     241                            BigInteger r = 0;
     242                            foreach(var n in Input1.Divisors())
     243                            {
     244                                r += n;
     245                            }
     246                            result = r;
     247                            break;
     248                        case NumberOperation.Divnum:
     249                            result = Input1.Divisors().Count;
     250                            break;
     251                        case NumberOperation.Pi:
     252                            BigInteger pi = 0;
     253                            for(BigInteger b = 2; b <= Input1; b++)
     254                            {
     255                                if (b.IsProbablePrime())
     256                                {
     257                                    pi++;
     258                                }
     259                                if (!_running)
     260                                {
     261                                    return;
     262                                }
     263                            }
     264                            result = pi;
     265                            break;
     266                        case NumberOperation.PrimeN:
     267                            BigInteger p = 0;
     268                            BigInteger i = 2;
     269                            while (Input1 <= 0 && _running)
     270                            {
     271                                if (i.IsProbablePrime())
     272                                {
     273                                    p++;
     274                                    if (p == Input1)
     275                                    {
     276                                        result = i;
     277                                        break;
     278                                    }
     279                                }
     280                                i++;
     281                            }
     282                            break;
     283                        case NumberOperation.Nextprime:
     284                            result = Input1.NextProbablePrime();
     285                            break;
     286                        case NumberOperation.Prevprime:
     287                            result = Input1.PreviousProbablePrime();
     288                            break;
     289                        case NumberOperation.Isprime:
     290                            result = (Input1.IsProbablePrime() ? 1 : 0);
     291                            break;
    230292                    }
    231 
    232                     Output = (Mod == 0) ? result : (((result % Mod) + Mod) % Mod);
     293                    Output = (Mod == 0) ? result : (((result % Mod) + Mod) % Mod);
    233294                }
    234295                catch (Exception e)
     
    237298                    return;
    238299                }
     300                finally
     301                {
     302                    _running = false;
     303                }
    239304
    240305                ProgressChanged(1.0, 1.0);
     
    248313        public void Stop()
    249314        {
     315            _running = false;
    250316        }
    251317
  • trunk/CrypPlugins/Numbers/NumberSettings.cs

    r8109 r8673  
    2020namespace Cryptool.Plugins.Numbers
    2121{
     22    public enum NumberOperation
     23    {
     24        Addition,
     25        Subtraction,
     26        Multiplication,
     27        Division,
     28        Power,
     29        GCD,
     30        LCM,
     31        SQRT,
     32        MODINV,
     33        Phi,
     34        Divsum,
     35        Divnum,
     36        Pi,
     37        PrimeN,
     38        Nextprime,
     39        Prevprime,
     40        Isprime
     41    }
    2242    class NumberSettings : ISettings
    2343    {
    2444        #region private variables
    2545
    26         private int operat;
     46        private NumberOperation operat;
    2747
    2848        #endregion
    2949
    3050        #region taskpane
    31 
    32         /// <summary>
    33         /// The checkbox with its options.
    34         ///
    35         /// Based on the option chosen, the icon for this plug-in will also change.
    36         /// </summary>
    37         [TaskPane("OperatCaption", "OperatTooltip", null, 1, false, ControlType.ComboBox, new string[] { "OperatList1", "OperatList2", "OperatList3", "OperatList4", "OperatList5", "OperatList6", "OperatList7", "OperatList8", "OperatList9", "OperatList10" })]
    38         public int Operat
     51     
     52        [TaskPane("OperatCaption", "OperatTooltip", null, 1, false, ControlType.ComboBox, new string[] {
     53            "OperatList1",
     54            "OperatList2",
     55            "OperatList3",
     56            "OperatList4",
     57            "OperatList5",
     58            "OperatList6",
     59            "OperatList7",
     60            "OperatList8",
     61            "OperatList9",
     62            "OperatList10",
     63            "Divsum",
     64            "Divnum",
     65            "Pi",
     66            "Prime",
     67            "Nextprime",
     68            "Prevprime",
     69            "Isprime"})]
     70        public NumberOperation Operat
    3971        {
    4072            get { return this.operat; }
    4173            set
    4274            {
    43                 if ((int)value != this.operat)
     75                if (value != this.operat)
    4476                {
    45                     this.operat = (int)value;
     77                    operat = value;
    4678                    OnPropertyChanged("Operat");
    4779
     
    5587        /// </summary>
    5688        /// <param name="operat"></param>
    57         public void changeToCorrectIcon(int operat)
     89        public void changeToCorrectIcon(NumberOperation operat)
    5890        {
    5991            switch (operat)
    6092            {
    61                 // x+y
    62                 case 0:
     93                case NumberOperation.Addition:
    6394                    ChangePluginIcon(0);
    6495                    break;
    65                 // x-y
    66                 case 1:
     96                case NumberOperation.Subtraction:
    6797                    ChangePluginIcon(1);
    6898                    break;
    69                 // x*y
    70                 case 2:
     99                case NumberOperation.Multiplication:
    71100                    ChangePluginIcon(2);
    72101                    break;
    73                 // x/y
    74                 case 3:
     102                case NumberOperation.Division:
    75103                    ChangePluginIcon(3);
    76104                    break;
    77                 // x^y
    78                 case 4:
     105                case NumberOperation.Power:
    79106                    ChangePluginIcon(4);
    80107                    break;
    81                 // gcd(x,y)
    82                 case 5:
     108                case NumberOperation.GCD:
    83109                    ChangePluginIcon(5);
    84110                    break;
    85111                // lcm(x,y)
    86                 case 6:
     112                case NumberOperation.LCM:
    87113                    ChangePluginIcon(6);
    88114                    break;
    89                 // sqrt(x)
    90                 case 7:
     115                case NumberOperation.SQRT:
    91116                    ChangePluginIcon(7);
    92117                    break;
    93                 // modinv(x,y)
    94                 case 8:
     118                case NumberOperation.MODINV:
    95119                    ChangePluginIcon(8);
    96120                    break;
    97                 // phi(x)
    98                 case 9:
     121                case NumberOperation.Phi:
    99122                    ChangePluginIcon(9);
     123                    break;
     124                case NumberOperation.Divsum:
     125                    ChangePluginIcon(10);
     126                    break;
     127                case NumberOperation.Divnum:
     128                    ChangePluginIcon(11);
     129                    break;
     130                case NumberOperation.Pi:
     131                    ChangePluginIcon(12);
     132                    break;
     133                case NumberOperation.PrimeN:
     134                    ChangePluginIcon(13);
     135                    break;
     136                case NumberOperation.Nextprime:
     137                    ChangePluginIcon(14);
     138                    break;
     139                case NumberOperation.Prevprime:
     140                    ChangePluginIcon(15);
     141                    break;
     142                case NumberOperation.Isprime:
     143                    ChangePluginIcon(16);
    100144                    break;
    101145            }
  • trunk/CrypPlugins/Numbers/Numbers.csproj

    r8187 r8673  
    206206    <Resource Include="icons\rootIcon.png" />
    207207  </ItemGroup>
     208  <ItemGroup>
     209    <Resource Include="icons\divnumIcon.png" />
     210    <Resource Include="icons\divsumIcon.png" />
     211    <Resource Include="icons\IsPrimeIcon.png" />
     212    <Resource Include="icons\NextPrimeIcon.png" />
     213    <Resource Include="icons\PiIcon.png" />
     214    <Resource Include="icons\PrevPrimeIcon.png" />
     215    <Resource Include="icons\PrimeNIcon.png" />
     216  </ItemGroup>
    208217  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    209218  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Note: See TracChangeset for help on using the changeset viewer.