Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/35: Рейтинг темы: голосов - 35, средняя оценка - 4.69
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
1

Как работать с большими числами, не вмещающиеся в тип double

19.01.2012, 23:03. Показов 6350. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Нужно найти x.

6^x mod 89548831 = 35152307

я решил сделать обычным перебором. Но числа огромные, и когда x доходит до 396, число становится слишком большим, чтобы вместиться в переменную типа double. Как можно решить эту проблему? Числа простые, поэтому использовать кратные им не выйдет.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double h;
            double hd;
            int p, g, x;
            p = 89548831;
            g = 6;
            x = 0;
            h = 0;
            hd = 0;
            
            if (h == 35152307)
            {
 
            }
            else
            {
                for (int i = 0; i <= 400; i++)
                {
                    x = i;
                    hd = Math.Pow(g, x);
                    h = ((hd) % p);
                    Console.WriteLine("{0}^{1}mod {2} = {3}     {4}", g, x, p, h, hd);
 
                }
            }
            Console.ReadLine();
 
        }
    }
}
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2012, 23:03
Ответы с готовыми решениями:

Как работать с большими числами
Если нужно с числами длиной 128 бит или больше. Есть ли встроенный тип данных для таких размеров.

Как работать с большими числами?
Пытаюсь записать и вывести большое число. Запись числа //Дата в миллисекундах...

Как работать с очень большими числами?
Как можно складывать, вычитать, умножать друг на друга очень большие числа, которые не вмещаются...

Как работать с большими числами (больше чем int64)?
Дело такое: написал алгоритм, где генерируется код, по которому далее шифруется текст. Шифрование...

7
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
20.01.2012, 00:26 2
Задача точно решается не перебором
Но если очень хочется:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
 
namespace SampleBigInteger
{
    class Program
    {
        static void Main(string[] args)
        {
            BigInteger x = 0;
            var stopwatch = System.Diagnostics.Stopwatch.StartNew();
            while (powmod(6, ++x) % 89548831 != 35152307)
            {
                if (x % 1000 == 0) Console.WriteLine("{0}, {1}, {2}", x, powmod(6, x) % 89548831, stopwatch.Elapsed);
            }
            Console.WriteLine("Element: {0}, time: {1}", x, stopwatch.Elapsed);
            stopwatch.Stop();
            Console.ReadKey();
        }
 
        static BigInteger powmod(BigInteger a, BigInteger k)
        {
            BigInteger b = 1;
 
            while (k != 0)
            {
                if (k % 2 == 0)
                {
                    k /= 2;
                    a *= a; 
                }
                else
                {
                    k--;
                    b *= a; 
                }
            }
            return b;
        }
    }
}
Добавлено через 3 минуты
По приколу дошел до х=40000. Не оно. Может в алгоритме ошибся?
1
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
20.01.2012, 01:09  [ТС] 3
Цитата Сообщение от freeba Посмотреть сообщение
static BigInteger powmod(BigInteger a, BigInteger k)
* * * * {
* * * * * * BigInteger b = 1;
while (k != 0)
* * * * * * {
* * * * * * * * if (k % 2 == 0)
* * * * * * * * {
* * * * * * * * * * k /= 2;
* * * * * * * * * * a *= a;
* * * * * * * * }
* * * * * * * * else
* * * * * * * * {
* * * * * * * * * * k--;
* * * * * * * * * * b *= a;
* * * * * * * * }
* * * * * * }
* * * * * * return b;
* * * * }
freeba, можешь объяснить как это работает, я чёто не догоняю. А пространство имён
using System.Numerics только в Framework 4 да?

В алгоритме ошибки быть не должно.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.01.2012, 01:33 4
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
using System.Numerics только в Framework 4 да?
именно
1
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
20.01.2012, 02:28 5
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
можешь объяснить как это работает, я чёто не догоняю.
Это функция возведения в степень, неявно использующая двоичное представление (медленнее своих аналогов, но более понятная). Покури Кнута (только не увлекайся), помучай братца гугльберга. И снизойдет просветление на тебя.

Всю голову уже сломал над этой задачей. Спать пойду. Утро - вечера мудренее.
1
80 / 78 / 10
Регистрация: 29.12.2011
Сообщений: 183
22.01.2012, 00:08 6
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
Как работать с большими числами, не вмещающиеся в тип double
Создать свой числовой тип данных представляющих комплексные числа.
Экспоненциальная запись
Проще это числа вида 5,e+35 состоящие из двух частей.

Что нужно знать про арифметику с плавающей запятой
1
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
22.01.2012, 00:43  [ТС] 7
freeba, спустя 30 часов дошло до 245 000 но ответа пока не найдено. Перепроверил все данные, алгоритм. Ошибки быть не должно. Буду ждать.

ibmpc, спасибо, почитаю.
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
22.01.2012, 01:34 8
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
спустя 30 часов дошло до 245 000 но ответа пока не найдено.
Сурово. 6^245000 приличное число. Скоро начнет кончаться оперативка. Должен быть более православный способ.

Добавлено через 17 минут
Попробуй такой вариант. Только он основан на Double (если переписать на BigInteger возможно, подтвердиться ложность решения) и ответ содержит погрешность (полюбому). Но ответ - стольки значное число, что тут нужен не один год, для перебора влоб.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
            double x = 0;
            double n = 1;
            
            while (true)
            {
                n *=2;
                x = Math.Exp((double)1 / 6 * Math.Log(n * 89548831 + 35152307, Math.E));
                Console.WriteLine("{0}, {1}, {2}", x, n, stopwatch.Elapsed);
                if (x % 1 == 0) break;
            }
            Console.WriteLine("Element: {0}, time: {1}", x, stopwatch.Elapsed);
            stopwatch.Stop();
            Console.ReadKey();
0
22.01.2012, 01:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2012, 01:34
Помогаю со студенческими работами здесь

Как работать с числами типа long double
Возникает проблема при использовании типа long double при написании программы на Си. Ответом на...

Работа с большими числами (не влезающими в тип integer)
Помогите, пожалуйста! как в паскале сложить/вычесть/найти целую часть от деления больших чисел?...

Какой тип данных использовать для работы с большими числами?
Здравствуйте! Какой тип данных можно использовать для больших чисел( unsigned long long не...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru