Необходимо реализовать алгоритм Полларда (алгортим факторизации числа n) - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток) Необходимо реализовать алгоритм Полларда (алгортим факторизации числа n).
Листинг программы
  1. public partial class Form1 : Form
  2. {
  3. int n;
  4. int nd = 0;
  5. public Form1()
  6. {
  7. InitializeComponent();
  8. }
  9. int gcd(int a, int b)
  10. {
  11. while (b != 0)
  12. b = a % (a = b);
  13. return a;
  14. }
  15. Point plrd(int n)
  16. {
  17. int p = 0;
  18. int q = 0;
  19. Random rnd = new Random();
  20. int x0 = rnd.Next(2, n);
  21. int k = 0;
  22. //M = n;
  23. int[] x = new int[200];
  24. for (k = 1; nd<n; ++k)
  25. {
  26. x[k] = ((x0) * (x0) + 1) % n;
  27. x0 = x[k];
  28. if (k % 2 == 0)
  29. {
  30. int j = k / 2;
  31. nd = gcd(n, Math.Abs(x[k] - x[j]));
  32. if (nd != 1)
  33. {
  34. if (nd < n)
  35. {
  36. p = nd;
  37. q = n / p;
  38. Point a = new Point(p, q);
  39. return a;
  40. }
  41. else
  42. {
  43. plrd(n);
  44. }
  45. }
  46. }
  47. }
  48. return new Point();
  49. }
  50. private void button1_Click(object sender, EventArgs e)
  51. {
  52. try
  53. {
  54. n = Convert.ToInt32(textBox1.Text);
  55. }
  56. catch
  57. {
  58. MessageBox.Show("Введите корректное значение", "Error!");
  59. }
  60. Point c = plrd(n);
  61. int p = c.X;
  62. int q = c.Y;
  63. MessageBox.Show(Convert.ToString(p));
  64. MessageBox.Show(Convert.ToString(q));
  65. }
Дело в том, что не всегда удается получить корректные значения p и q. Например, при n=4, при n=10. Помогите разобраться

Решение задачи: «Необходимо реализовать алгоритм Полларда (алгортим факторизации числа n)»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace Pillard
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         int n;
  15.         int z = 0;
  16.  
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         int gcd(int a, int b)
  22.         {
  23.             while (b != 0)
  24.                 b = a % (a = b);
  25.             return a;
  26.         }
  27.  
  28.         Point plrd(int n)
  29.         {
  30.             int i = 1;
  31.             int nd = 0;
  32.             int p = 0;
  33.             int q = 0;
  34.             Random rnd = new Random();
  35.             int x0 = rnd.Next(2, n);
  36.             int k = 2;
  37.             int x = x0;
  38.             while (true)
  39.             {
  40.                 i++;
  41.                 x = (x*x + 1) % n;
  42.                     int xx = Math.Abs(x0 - x);
  43.                     nd = gcd(n,xx);
  44.                     if (nd != 1)
  45.                     {
  46.                         if (nd < n)
  47.                         {
  48.                             p = nd;
  49.                             q = n / p;
  50.                             Point a = new Point(p, q);
  51.    
  52.                             return a;
  53.  
  54.                         }
  55.                         else
  56.                         {
  57.                             return new Point();
  58.                           //return plrd(n);
  59.                         }
  60.                     }
  61.                     if (i==k)
  62.                     {
  63.                         x0 = x;
  64.                         k *= 2;
  65.                     }
  66.              
  67.             }
  68.    
  69.         }
  70.  
  71.         private void button1_Click(object sender, EventArgs e)
  72.         {
  73.             try
  74.             {
  75.                 n = Convert.ToInt32(textBox1.Text);
  76.  
  77.             }
  78.             catch
  79.             {
  80.                 MessageBox.Show("Введите корректное значение", "Error!");
  81.             }
  82.  
  83.             Point c = plrd(n);
  84.             int p = c.X;
  85.             int q = c.Y;
  86.             MessageBox.Show(Convert.ToString(p));
  87.             MessageBox.Show(Convert.ToString(q));
  88.  
  89.         }
  90.  
  91.     }
  92. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы