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

Last change on this file since 750 was 750, checked in by nolte, 12 years ago

Added the GCD function to the BigNumberOperations.
Sample submit included.

File size: 7.8 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;
22
23namespace Cryptool.Plugins.BigNumber
24{
25    [Author("Sven Rech", "sven.rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
26    [PluginInfo(false, "BigNumberOperation", "Big Number Operation", null, "BigNumber/icons/plusIcon.png", "BigNumber/icons/minusIcon.png", "BigNumber/icons/timesIcon.png", "BigNumber/icons/divIcon.png", "BigNumber/icons/powIcon.png", "BigNumber/icons/gcdicon.png")]
27    class BigNumberOperation : IThroughput
28    {
29
30        public BigNumberOperation()
31        {
32            this.settings.OnPluginStatusChanged += settings_OnPluginStatusChanged;
33        }
34
35        #region Properties
36
37        private BigInteger input1 = null;
38        [PropertyInfo(Direction.InputData, "x Input", "Number Input 1", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
39        public BigInteger Input1
40        {
41            get
42            {
43                return input1;
44            }
45            set
46            {
47                input1 = value;
48                OnPropertyChanged("Input1");
49            }
50        }
51
52        private BigInteger input2 = null;
53        [PropertyInfo(Direction.InputData, "y Input", "Number Input 2", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
54        public BigInteger Input2
55        {
56            get
57            {
58                return input2;
59            }
60            set
61            {
62                input2 = value;
63                OnPropertyChanged("Input2");
64            }
65        }
66
67        private BigInteger mod = null;
68        [PropertyInfo(Direction.InputData, "Modulo", "Modulo Input", "", DisplayLevel.Beginner)]
69        public BigInteger Mod
70        {
71            get
72            {
73                return mod;
74            }
75            set
76            {
77                mod = value;
78                OnPropertyChanged("Mod");
79            }
80        }
81
82        private BigInteger output = null;
83        [PropertyInfo(Direction.OutputData, "Output", "Number Output", "", DisplayLevel.Beginner)]
84        public BigInteger Output
85        {
86            get
87            {
88                return output;
89            }
90            set
91            {
92                output = value;
93                OnPropertyChanged("Output");
94             }
95        }
96
97        #endregion
98
99        #region IPlugin Members
100
101        public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
102
103        public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
104
105        private void GuiLogMessage(string p, NotificationLevel notificationLevel)
106        {
107            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(p, this, notificationLevel));
108        }
109
110        public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
111
112        private void ProgressChanged(double value, double max)
113        {
114            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
115        }
116
117        private BigNumberOperationSettings settings = new BigNumberOperationSettings();
118        public ISettings Settings
119        {
120            get { return settings; }
121            set { settings = (BigNumberOperationSettings)value; }
122        }
123
124        public System.Windows.Controls.UserControl Presentation
125        {
126            get { return null; }
127        }
128
129        public System.Windows.Controls.UserControl QuickWatchPresentation
130        {
131            get { return null; }
132        }
133
134        public void PreExecution()
135        {
136            input1 = null;
137            input2 = null;
138            mod = null;
139        }
140
141        public void Execute()
142        {
143            if (input1 != null && input2 != null)
144            {
145                ProgressChanged(0.5, 1.0);
146                try
147                {
148                    switch (settings.Operat)
149                    {
150                        case 0:
151                            if (Mod is object)
152                                Output = (Input1 + Input2) % Mod;
153                            else
154                                Output = Input1 + Input2;
155                            break;
156                        case 1:
157                            if (Mod is object)
158                                Output = (Input1 - Input2) % Mod;
159                            else
160                                Output = Input1 - Input2;
161                            break;
162                        case 2:
163                            if (Mod is object)
164                                Output = (Input1 * Input2) % Mod;
165                            else
166                                Output = Input1 * Input2;
167                            break;
168                        case 3:
169                            if (Mod is object)
170                                Output = (Input1 / Input2) % Mod;
171                            else
172                                Output = Input1 / Input2;
173                            break;
174                        case 4:
175                            if (Mod is object)
176                            {
177                                if (Input2 >= 0)
178                                    Output = Input1.modPow(Input2, Mod);
179                                else
180                                {
181                                    Output = Input1.modInverse(Mod).modPow(-Input2, Mod);
182                                }
183                            }
184                            else
185                            {
186                                Output = Input1.pow(Input2);
187                            }
188                            break;
189                        case 5:
190                                Output = Input1.gcd(Input2);
191                            break;
192                    }
193                }
194                catch (Exception e)
195                {
196                    GuiLogMessage("Big Number fail: " + e.Message, NotificationLevel.Error);
197                    return;
198                }
199                ProgressChanged(1.0, 1.0);
200            }
201        }
202
203        public void PostExecution()
204        {
205        }
206
207        public void Pause()
208        {
209        }
210
211        public void Stop()
212        {
213        }
214
215        public void Initialize()
216        {
217        }
218
219        public void Dispose()
220        {
221        }
222
223        #endregion
224
225        #region INotifyPropertyChanged Members
226
227        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
228
229        private void OnPropertyChanged(string p)
230        {
231            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(p));
232        }
233
234        #endregion
235
236        private void settings_OnPluginStatusChanged(IPlugin sender, StatusEventArgs args)
237        {
238            if (OnPluginStatusChanged != null) OnPluginStatusChanged(this, args);
239        }
240    }
241}
Note: See TracBrowser for help on using the repository browser.