Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
1

Найти такое число b, что (a*b - 1) % p = 0

06.07.2023, 14:27. Показов 2372. Ответов 25

Author24 — интернет-сервис помощи студентам
Есть число 2<=p<10^9 и число 0<a<p необходимо найти такое число b, что (a*b - 1) % p = 0
Есть идея использовать малую теорему Ферма (найти остаток от деления (a^(p - 2))%p), но т.к. p и a огромные, то такие числа хранить просто негде, нашел решение такой задачи на python (Обратное число ), но там используется встроенная функция pow(x, y, z) и туда можно передать в z число для получения остатка от деления (x^y%z).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2023, 14:27
Ответы с готовыми решениями:

Дано положительное число А > 10. Найти такое k, что (k-1)! <= A < k
Я здесь новичок, помогите,пожалуйста, с программой! Дано положительное число А&gt;10. Найти такое k,...

Найти наименьшее число r, такое что 2 ^r≥N
Дано натуральное число N. Найти наименьшее число r, такое что 2r≥N.

Дано вещественное число а. Найти такое наименьшее n, что 1+ (1/2)+(1/3)+...+(1/n)>а
а эту же задачу на C++ с циклом while НАПРИМЕР можете написать?

По числу z найти такое число x, что z = (2x +1)*2^y для некоторого y
Найти по числу z число x такое, что z = (2x +1)*2^y для некоторого y. Использовать...

Найти по числу z такое число x , что z = ( 2x+1 ) * 2 ^y (доказать семантику)
структур. программы с метками 1 a = z; 2 2 y = 0; 3 3 if (a % 2 == 0) then 4 else 7 4 y...

25
Модератор
Эксперт С++
13701 / 10904 / 6472
Регистрация: 18.12.2011
Сообщений: 29,110
06.07.2023, 15:58 2
Цитата Сообщение от a1paca Посмотреть сообщение
такие числа хранить просто негде
А может, long long int хватит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
int main()
{
    long long a,b=1L,p;
    std::cin>>a>>p;
    std::cin.get();
    while( b<p && (a*b-1)%p!=0 )++b;
    if(b==p)
        std::cout<<"Not found\n";
    else
        std::cout<<b<<std::endl;
    std::cin.get();
    return 0;
}
0
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
06.07.2023, 16:07  [ТС] 3
не хватит (10^9)^(10^9)
0
Модератор
Эксперт С++
13701 / 10904 / 6472
Регистрация: 18.12.2011
Сообщений: 29,110
06.07.2023, 16:42 4
Цитата Сообщение от a1paca Посмотреть сообщение
(a*b - 1) % p = 0
Где тут "в степени"?
0
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
06.07.2023, 17:02  [ТС] 5
Цитата Сообщение от a1paca Посмотреть сообщение
a^(p - 2))%p
это функция нахождения обратного числа полученная из малой теоремы ферма если находить сначала a^(p - 2), то как раз и получается в степени. Использование простого перебора не является наилучшим решением и не проходит по времени. Забыл написать, что p простое число
0
Модератор
Эксперт С++
13701 / 10904 / 6472
Регистрация: 18.12.2011
Сообщений: 29,110
06.07.2023, 17:09 6
Я не понимаю, как Вы свели условие (a*b - 1) % p = 0 к вычислению (a^(p - 2))%p
0
Вездепух
Эксперт CЭксперт С++
12783 / 6662 / 1793
Регистрация: 18.10.2014
Сообщений: 16,849
06.07.2023, 17:14 7
Цитата Сообщение от zss Посмотреть сообщение
Я не понимаю, как Вы свели условие (a*b - 1) % p = 0 к вычислению (a^(p - 2))%p
Обратное число

Нужно найти какое-то b, удовлетворяющее требованиям. Если взять b = ap-2, то a*b будет равно ap-1. А, согласно малой теореме Ферма, ap-1 - 1 делится на p. То есть будет a*b - 1 = 0 (mod p). А именно это нам и нужно.
2
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
06.07.2023, 17:24 8
Лучший ответ Сообщение было отмечено a1paca как решение

Решение

Цитата Сообщение от a1paca Посмотреть сообщение
не хватит (10^9)^(10^9)
Так в степень с умом возводить надо.. Все же по модулю. Умножил, и тут же взял остаток.
И возведением воспользоваться быстрым. Знаешь такое?
C++
1
2
3
4
5
6
7
8
9
long powQ(long a, long n, long p)
{
    if (n==0) return 1;
    if  (n==1) return a;
    long x = (n%2) ? a : 1;
    long b = powQ(a, n/2, p)%p;
    b = b*b%p;
    return b*x%p;
}
Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
Я не понимаю, как Вы свели условие (a*b - 1) % p = 0 к вычислению (a^(p - 2))%p
Математика, блин!
3
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
06.07.2023, 17:30  [ТС] 9
Цитата Сообщение от zss Посмотреть сообщение
Я не понимаю, как Вы свели условие (a*b - 1) % p = 0 к вычислению (a^(p - 2))%p
малая теорема Ферма Если p — простое число и a — целое число, не делящееся на,p, то a^(p - 1) - 1 % p == 0.

Добавлено через 5 минут
Спасибо огромное, не догадался брать остаток сразу, решение прошло
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
06.07.2023, 17:32 10
a1paca, Тема эта уже была на форуме. И обсосана до палочки
0
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
06.07.2023, 18:53  [ТС] 11
можно ссылку, пожалуйста
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
06.07.2023, 19:02 12
Цитата Сообщение от a1paca Посмотреть сообщение
можно ссылку, пожалуйста
В подписках не сохранилось. Помню, что в разделе С++. И я там участвовал. И уважаемый TheCalligrapher тоже.
Не так давно. В этом году. Понимаю, что данных мало. Но в обще-то, там все тоже самое.
1
Модератор
Эксперт CЭксперт С++
5198 / 2915 / 1509
Регистрация: 14.12.2018
Сообщений: 5,258
Записей в блоге: 1
07.07.2023, 09:18 13
Я сомневаюсь, что: кроме b=ap-2 есть ли другой вид ?
1
Модератор
Эксперт С++
13701 / 10904 / 6472
Регистрация: 18.12.2011
Сообщений: 29,110
07.07.2023, 09:34 14
Лучший ответ Сообщение было отмечено a1paca как решение

Решение

Поддерживаю Volga_.
Откуда следует, что других решений нет (для b!=ap-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
#include <iostream>
#include <vector>
using namespace std;
long long powQ(long long a, long long n, long long p)
{
    if (n==0) return 1;
    if  (n==1) return a;
    long long x = (n%2) ? a : 1;
    long long b = powQ(a, n/2, p)%p;
    b = b*b%p;
    return b*x%p;
}
int main()
{
    int n;
    cin>>n;
    vector<long long> a(n),p(n);
    for(int i=0;i<n;i++)
        cin>>p[i]>>a[i];
    cin.get();
    for(int i=0;i<n;i++)
        cout<<powQ(a[i],p[i]-2,p[i])<<endl;
    cin.get();
    return 0;
}
p.s. программа правильно работает только, если p - простое число!
1
Модератор
Эксперт CЭксперт С++
5198 / 2915 / 1509
Регистрация: 14.12.2018
Сообщений: 5,258
Записей в блоге: 1
07.07.2023, 12:12 15
Я верю, нужно найти в интервале [2; p-1] значение b чтобы (ab-1) кратно на p. Если нету, то нет решения. Поэтому я предлагаю:

C++
1
2
3
4
5
6
7
unsigned long long b=2;
while (b < p)
{
    if ((a*b-1) % p == 0) { std::cout << "b = " << b; break; }
    b++;
}
if (b==p) std::cout << "No result";
Проверьте ! (Я не тестировал).
0
Модератор
Эксперт С++
13701 / 10904 / 6472
Регистрация: 18.12.2011
Сообщений: 29,110
07.07.2023, 13:02 16
Volga_, я похожий код привёл в сообщении №2.
Однако, он 100% не подойдёт ТС по времени выполнения
1
Модератор
Эксперт CЭксперт С++
5198 / 2915 / 1509
Регистрация: 14.12.2018
Сообщений: 5,258
Записей в блоге: 1
07.07.2023, 14:25 17
zss, ух, не заметил.

a1paca, я предлагаю вам код, он может подойти по времени выполнения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
int main()
{
    unsigned long long p, a;
    std::cout << "p = "; std::cin >> p;
    std::cout << "a = "; std::cin >> a;
    unsigned long long t=(a*(p-1)-1)/p, k=1;
    while (k <= t)
    {
        if ((k*p+1) % a == 0) 
        { 
            std::cout << "b = " << (k*p+1)/a; 
            break; 
        }
        k++;
    }
    return 0;
}
Попробуйте и проверьте !


Мой алгоритм:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
b \leq p-1\\ <br />
ab-1=kp<br />
\end{matrix}\right.<br />
Где
https://www.cyberforum.ru/cgi-bin/latex.cgi?k \in [1; t]
И
https://www.cyberforum.ru/cgi-bin/latex.cgi?t=\left[\frac{a(p-1)-1}{p} \right]
Определить:
https://www.cyberforum.ru/cgi-bin/latex.cgi?b=\frac{kp+1}{a}
если найти число https://www.cyberforum.ru/cgi-bin/latex.cgi?k \in [1; t] чтобы https://www.cyberforum.ru/cgi-bin/latex.cgi?kp+1 \equiv 0 (mod  a)
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
07.07.2023, 18:36 18
Цитата Сообщение от zss Посмотреть сообщение
Откуда следует, что других решений нет
Из единственности обратного элемент в группе

Добавлено через 23 минуты
Точнее, оно единственно (если есть) в кольце Zp.
То есть все решения равны по модулю p.
А если наложить условие 0< b < p (или минимальности), что естественно, то и единственно
1
Модератор
Эксперт CЭксперт С++
5198 / 2915 / 1509
Регистрация: 14.12.2018
Сообщений: 5,258
Записей в блоге: 1
08.07.2023, 07:17 19
Байт, я несовсем вижу вида b=ap-2 при 0<b<p. Например: при p=7, a=3 получается решение b=5.
0
1 / 1 / 0
Регистрация: 06.07.2023
Сообщений: 33
08.07.2023, 07:20  [ТС] 20
там остаток от деления еще, т.е. b = (a^p-2)%p
1
08.07.2023, 07:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2023, 07:20
Помогаю со студенческими работами здесь

Дано вещественное число a. Найти такое наименьшее n, что 1+1/2+1/3+.+1/n>a
Дано вещественное число a. Найти такое наименьшее n, что 1+1/2+1/3+...+1/n&gt;a. (С++)

Найти число m<p, такое что, m*n при делении на p дает остаток 1
даны натуральные числа n и p.найдите m такое,что,во-первых,m&lt;p,во-вторых,произведение чисел m и n...

Найти наибольшее число I, такое, что F(I) < 2^N", где F(I) = F(I-1)+F(I-2)+f(I-3), F(1)=F(2)=F(3)=1, N вводится
Добрейшего времени суток, необходима помощь в решении задачи. Сама задача: &quot;Найти наибольшее...

Найти такое число m, что m! является ближайшим к N значением факториала
3. С клавиатуры вводится целое число N. Найти такое число m, что m! является ближайшим к N...

Найти число такое, что произведение его цифр равняется заданному числу
Дано число 0 &lt; q &lt; 1 000 000 000, являющееся произведением десятичных цифр некоторого числа. Найти...


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

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