source: trunk/CrypPlugins/BigNumber/BigNumberOperation.cs @ 1448

Last change on this file since 1448 was 1448, checked in by Sven Rech, 12 years ago

replaced all BigInteger stuff with the new BigInteger class from .net 4.0

But there are still problems with some plugins (Keysearcher, BigInteger Operations...)

File size: 9.1 KB
Line 
1/*                             
2   Copyright 2009 Team CrypTool (Sven Rech,Dennis Nolte,Raoul Falk,Nils Kopal), Uni Duisburg-Essen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using Cryptool.PluginBase.IO;
19using Cryptool.PluginBase;
20using Cryptool.PluginBase.Miscellaneous;
21using System.ComponentModel;
22using System.Numerics;
23
24namespace Cryptool.Plugins.BigNumber
25{
26    [Author("Sven Rech", "sven.rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
27    [PluginInfo(false, "BigNumberOperation", "Big Number Operation", "BigNumber/DetailedDescription/DescriptionOperation.xaml", "BigNumber/icons/plusIcon.png", "BigNumber/icons/minusIcon.png", "BigNumber/icons/timesIcon.png", "BigNumber/icons/divIcon.png", "BigNumber/icons/powIcon.png", "BigNumber/icons/gcdicon.png")]
28    class BigNumberOperation : IThroughput
29    {
30
31        #region private variable
32        //The variables are defined
33        private BigInteger input1 = 0; 
34        private BigInteger input2 = 0;
35        private BigInteger mod = 0;
36        private BigInteger output = 0;
37        private BigNumberOperationSettings settings = new BigNumberOperationSettings();
38
39        #endregion
40
41        #region event
42
43        public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
44
45        public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;     
46
47        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
48
49        public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
50
51        #endregion
52
53        #region public
54
55        public BigNumberOperation()
56        {
57            this.settings.OnPluginStatusChanged += settings_OnPluginStatusChanged;
58        }
59
60        /// <summary>
61        /// The inputs are defined.
62        /// Only BigInteger are accepted.
63        /// </summary>
64        [PropertyInfo(Direction.InputData, "x Input", "Number input 1", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
65        public BigInteger Input1
66        {
67            get
68            {
69                return input1;
70            }
71            set
72            {
73                input1 = value;
74                OnPropertyChanged("Input1");
75            }
76        }
77
78       
79        [PropertyInfo(Direction.InputData, "y Input", "Number input 2", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
80        public BigInteger Input2
81        {
82            get
83            {
84                return input2;
85            }
86            set
87            {
88                input2 = value;
89                OnPropertyChanged("Input2");
90            }
91        }
92
93       
94        [PropertyInfo(Direction.InputData, "Modulo", "Modulo input", "", DisplayLevel.Beginner)]
95        public BigInteger Mod
96        {
97            get
98            {
99                return mod;
100            }
101            set
102            {
103                mod = value;
104                OnPropertyChanged("Mod");
105            }
106        }
107
108        /// <summary>
109        /// The output is defined.
110        /// </summary>
111        [PropertyInfo(Direction.OutputData, "Output", "Number output", "", DisplayLevel.Beginner)]
112        public BigInteger Output
113        {
114            get
115            {
116                return output;
117            }
118            set
119            {
120                output = value;
121                OnPropertyChanged("Output");
122             }
123        }
124
125       
126        /// <summary>
127        /// Showing the progress change while plug-in is working
128        /// </summary>
129        /// <param name="value">Value of current process progress</param>
130        /// <param name="max">Max value for the current progress</param>
131        private void ProgressChanged(double value, double max)
132        {
133            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
134        }
135
136       
137        public ISettings Settings
138        {
139            get { return settings; }
140            set { settings = (BigNumberOperationSettings)value; }
141        }
142
143
144        public System.Windows.Controls.UserControl Presentation
145        {
146            get { return null; }
147        }
148
149        public System.Windows.Controls.UserControl QuickWatchPresentation
150        {
151            get { return null; }
152        }
153
154        public void PreExecution()
155        {
156            input1 = 0;
157            input2 = 0;
158            mod = 0;
159        }
160
161        /// <summary>
162        /// Main method
163        /// </summary>
164        public void Execute()
165        {
166            //First checks if both inputs are set
167            if (input1 != null && input2 != null)
168            {
169                ProgressChanged(0.5, 1.0);
170                try
171                {
172                    //As the user changes the operation different outputs are calculated.
173                    switch (settings.Operat)
174                    {
175                        // x + y
176                        case 0:
177                            if (Mod != 0)
178                                Output = (Input1 + Input2) % Mod;
179                            else
180                                Output = Input1 + Input2;
181                            break;
182                        // x - y
183                        case 1:
184                            if (Mod != 0)
185                                Output = (Input1 - Input2) % Mod;
186                            else
187                                Output = Input1 - Input2;
188                            break;
189                        //x * y
190                        case 2:
191                            if (Mod != 0)
192                                Output = (Input1 * Input2) % Mod;
193                            else
194                                Output = Input1 * Input2;
195                            break;
196                        // x / y
197                        case 3:
198                            if (Mod != 0)
199                                Output = (Input1 / Input2) % Mod;
200                            else
201                                Output = Input1 / Input2;
202                            break;
203                        // x ^ y
204                        case 4:
205                            if (Mod != 0)
206                            {
207                                if (Input2 >= 0)
208                                    Output = BigInteger.ModPow(Input1, Input2, Mod);
209                                else
210                                {
211                                    Output = BigInteger.ModPow(BigIntegerHelper.ModInverse(Input1, Mod), -Input2, Mod);
212                                }
213                            }
214                            else
215                            {
216                                Output = BigInteger.Pow(Input1, (int)Input2);
217                            }
218                            break;
219                        // gcd(x,y)
220                        case 5:
221                            Output = BigInteger.GreatestCommonDivisor(Input1, Input2);
222                            break;
223                    }
224                }
225                catch (Exception e)
226                {
227                    GuiLogMessage("Big Number fail: " + e.Message, NotificationLevel.Error);
228                    return;
229                }
230                ProgressChanged(1.0, 1.0);
231            }
232        }
233
234        public void PostExecution()
235        {
236        }
237
238        public void Pause()
239        {
240        }
241
242        public void Stop()
243        {
244        }
245
246        public void Initialize()
247        {           
248            //change to the correct icon which belongs to actual selected arithmetic function
249            ((BigNumberOperationSettings)this.settings).changeToCorrectIcon(((BigNumberOperationSettings)this.settings).Operat);
250        }
251
252        public void Dispose()
253        {
254        }
255
256        #endregion
257
258        #region private       
259
260        private void OnPropertyChanged(string p)
261        {
262            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(p));
263        }
264
265        private void GuiLogMessage(string p, NotificationLevel notificationLevel)
266        {
267            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(p, this, notificationLevel));
268        }
269
270        private void settings_OnPluginStatusChanged(IPlugin sender, StatusEventArgs args)
271        {
272            if (OnPluginStatusChanged != null) OnPluginStatusChanged(this, args);
273        }
274
275        #endregion
276    }
277}
Note: See TracBrowser for help on using the repository browser.