Предположим, что существует данное число, которое мы должны протестировать, если это - продукт четырех последовательных чисел?
Итак, если y
наше данное число, которое мы должны протестировать если y = x(x+1)(x+2)(x+3)
для любого произвольного x
?
Как разработать алгоритм для этой проблемы?
Я сделал это как это:
import java.util.*;
public class Product
{
public static int product(int i)
{
return i * (i+1) * (i+2) * (i+3);
}
public static void main(String[] args)
{
Scanner scnr = new Scanner(System.in);
int x = scnr.nextInt();
for (int i = 0; i < x/2; i++)
{
if (product(i) == x)
{
System.out.println("number is product of 4 consecutive numbers");
break;
}
}
}
}
Начиная с
y = x(x+1)(x+2)(x+3) = x^4 + 6x^3 + 11x^2 + 6x
Обратите внимание, что коэффициенты почти симметричны, но в конце нет единицы.
Итак, предположим, что
y = z^2 - 1
т.е.
z^2 = x^4 + 6x^3 + 11x^2 + 6x + 1
Есть коэффициенты при всех степенях x до 4, а коэффициенты при x ^ 4 и x ^ 0 равны 1, поэтому нам нужно найти коэффициент при x ^ 1, который мы называем a
:
z = (x^2 + ax + 1)^2 = x^4 + 2ax^3 + (2+a^2)x^2 + 2ax + 1
сравнение коэффициента x ^ 1, x ^ 2 или x ^ 3 дает a = 3
(приведенные выше уравнения не требуют, чтобы любое из x, y или z было целым числом, но будет возможно потерять комплексные или отрицательные корни, которые нас не интересуют)
, поэтому мы можем решить квадратичное для x
:
x^2 + 3x + 1 - sqrt(y+1) = 0
дает
x = -3 +/- sqrt(9 - 4 * (1-sqrt(y+1)))
---------------------------------
2
= -3 +/- sqrt(5 + 4 sqrt(y+1))
----------------------------
2
, которое будет целым, если sqrt (y + 1)
- это полный квадрат z
, и (5 + 4z)
также полный квадрат (если z
- целое число, 5-4z
нечетно, поэтому его квадратный корень, если он целое, также нечетный и x
будет целым числом).
Итак, проверьте, является ли z = sqrt (y + 1)
целым числом, а затем проверьте, является ли 5 + 4z
полным квадратом.
Я бы начал с получения корня четвертой степени от «у». Это даст вам приблизительное значение для наименьшего множителя y (например, «x»), который вы могли бы использовать. Используйте это как основу стандартного алгоритма факторизации.
Ответ очень простой.
Для данного числа y, если y + 1 не является полным квадратом, тогда y не является произведением четырех последовательных чисел.
Если y + 1 является точным квадратом, тогда y является произведением четырех последовательных чисел тогда и только тогда, когда sqrt (5 + 4 * sqrt (y + 1)) является целым числом.
Как говорили другие, начните с корня четвертой степени y (назовем его z).
Из последовательности x, x + 1, ... x + 3 мы знаем, что некоторые значения должны быть меньше z, а некоторые должны быть больше z (поскольку все они не могут быть равны z) .
Итак, мы знаем, что
x <= ceiling(z)
x+3 >= floor(z)
Это дает вам очень небольшой диапазон чисел, которые можно попробовать для x.
Для многих чисел мы можем легко определить, подходят ли они под определенный X или нет:
Таким образом, Y должно быть хотя бы кратно 12 (3*4). Это означает, что вы можете легко отбросить около 92% всех чисел.
Так как значение Y будет содержать по крайней мере 4-ю силу X, вы можете начать с извлечения 4-го корня (или как это называется по-английски) из Y, затем округлить его до целого значения, назвать его X и вычислить результат X(X+1)(X+2)(X+3).
Результат, вероятно, будет выше (потому что мы опустили другие факторы, такие как X в степени 3, X в степени 2, ...).
Теперь вычтите 1 из X и проведите те же вычисления.
Пока результат будет больше Y, повторяйте это до тех пор, пока результат не станет меньше, или пока вы точно не получите Y.
. Подсчитайте корень четвертой степени из y
, округлите его в меньшую сторону и назовите a
. a (a-1) (a-2) (a-3)
намного меньше, чем y
. Подсчитайте корень четвертой степени из y
, округлите его и назовите b
. b (b + 1) (b + 2) (b + 3)
намного больше, чем y
. Теперь у вас есть три возможных числа, с которых можно начать: a-2
, a-1
и a
(примечание a = b
или а = b-1
). Поэтому должно быть достаточно проверить (a-2) (a-1) a (a + 1)
, (a-1) a (a + 1) (a + 2)
и а (а + 1) (а + 2) (а + 3)
.
Редактировать : прочитать вопрос неправильно, но чего стоит (быстрый способ проверить, не является ли он произведением четырех последовательных целых чисел):
Любое произведение четырех последовательные целые числа равны на единицу меньше , чем полный квадрат .
Ваше уравнение можно упростить
y = x^4 + 6*x^3 + 11*x^2 + 6x
Вы можете начать с x=1 и идти вверх для проверки. Мы можем отметить очень легко вычисляемую верхнюю границу: 4-й корень из y (или квадратный корень из квадратного корня из y). То есть, когда вы достигнете этого числа, вы можете остановиться. Это к счастью для вас, потому что к счастью для нас, 4-е корни очень очень очень очень очень маленькие.
Для чисел до 10 000 это довольно легко проверить, потому что вы собираетесь проверить не более десяти целых чисел. Если ваше число меньше 500, вам потребуется проверить не более четырех целых чисел.
При 1,000,000+, вам придется проверять 31 и более чисел, так что это может стать менее тривиальным.
После некоторого тщательного уточнения с помощью Wolfram Alpha, были получены два вывода:
Итак...
y = num_to_check
k = Math.sqrt(Math.sqrt(y)) # or Math.pow(y,0.25)
lower = int(k-1.5)
upper = int(Math.ceil(k-1.2))
for n in (lower...upper)
if n * (n+1) * (n+2) * (n+3) == y
return n
end
end
return nil
Заметим, что в этом случае для любого заданного y существует максимум два числа, которые необходимо проверить.
edit: после уточнения x только до целых чисел, оказывается, что проверять нужно только одно число во всех случаях, так как ваш диапазон уменьшается до одного числа. Круто! (спасибо Брайану)
Вам нужно только проверить этаж (y ** (0,25) -1)
. Когда y приближается к бесконечности, x приближается к y ** 0,25–1,5
(снизу).
В некоторой степени это довольно интуитивно понятно. x * (x + 1) * (x + 2) * (x + 3)
- произведение четырех чисел, среднее значение которых равно x + 1,5
. Когда x высокий, 1,5 выглядит маленьким.