Це напівпринцип?


26

Дивно, але я не думаю, що у нас є питання з для визначення того, чи є число напівпримітним .

Напівприкмета - це натуральне число, яке є добутком двох (не обов'язково відмінних) простих чисел.

Досить проста, але надзвичайно важлива концепція.

Давши додатне ціле число, визначте, чи це напівприкмета. Вихід може бути в будь-якій формі, якщо він дає однаковий результат для будь-якого значення truthy або falsey. Ви також можете припустити, що ваш внесок достатньо малий, що продуктивність або переповнення не є проблемою.

Тестові приклади:

input -> output
1     -> false
2     -> false
3     -> false
4     -> true
6     -> true
8     -> false
30    -> false   (5 * 3 * 2), note it must be EXACTLY 2 (non-distinct) primes
49    -> true    (7 * 7)      still technically 2 primes
95    -> true
25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
      -> true, and go call someone, you just cracked RSA-2048

Це , тому застосовуються стандартні правила!


4
@WheatWizard Існує незначна різниця в тому, що потрібно просити 3 праймери (не велика різниця майже для всіх мов), і це лише для різних праймерів (досить різних для деяких мов). Я можу обговорити це з вами у чаті, якщо ви хочете продовжити більш детальну дискусію.
HyperNeutrino

2
@WheatWizard Ви піднімаєте хорошу думку, але аналогічно, у нас вже є маса багатьох питань, і хоча, на відміну від того, що ви висловлюєте, більшість з них вносять вагомий внесок у свою область, це питання має достатньо різниці що я вважаю, що це вимагає окремого питання / повідомлення.
HyperNeutrino

2
@hyperneutrino, дивлячись на відповіді на обидва виклики, схоже, різниця - це одне число у вихідному коді, 2 проти 3. Я навряд чи би назвав це великою різницею.
Пшеничний майстер

2
@WheatWizard Є також "виразний" проти "не виразний" ...
HyperNeutrino

3
@LordFarquaad Тільки тому, що його дублікат не означає, що це погано. На мій погляд, дублікат - це гарна річ, це означає, що ви запитуєте те, що громада вважає достатньо цікавою, про яку вже просили.
Пшеничний майстер

Відповіді:


19

Брахілог , 2 байти

В основному порт з відповіді Fatalize на виклик сферичних номерів.

ḋĊ

Спробуйте в Інтернеті!

Як?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple

1
Правильна мова для роботи: P
HyperNeutrino

2
@Uriel Ċ- це фактично вбудований список двох змінних; Будучи декларативною мовою, вихідний за замовчуванням є тестом на задоволення (наприклад, самостійно виводиться true.для невід'ємних цілих чисел).
Джонатан Аллан

Як це 2 байти?
Гарольд

1
@harold Я щойно оновив, щоб зробити "байти" в заголовку посилання на кодову сторінку Брахілога. Шістнадцятковий смітник був би c6 eb.
Джонатан Аллан


8

Математика, 16 байт

PrimeOmega@#==2&

PrimeOmega підраховує кількість простих факторів, рахуючи кратність.


1
Данг, є вбудований?
JungHwan Min

1
@JungHwanMin Якби там булоSemiprimeQ
ngenisis

Приємно. Я не знав про цеPrimeOmega
DavidC


7

Python 3 , 54 байти

lambda n:0<sum((n%x<1)+(x**3==n)for x in range(2,n))<3

Спробуйте в Інтернеті!

Попередній Версон був деякі проблеми з округленням на великій кількості куби ( 125, 343і т.д.)
Це обчислює кількість дільників (не тільки прості числа), якщо у нього є 1або 2він повертає True.
Єдиний виняток - коли число має більше двох простих факторів, але лише два дільника. У цьому випадку це ідеальний куб простих ліній (його дільники - кубик кореня, а кубик кореня - у квадраті). x**3==nбуде охоплювати цей випадок, додавання одного в кутовий кореневий запис підштовхує суму до рахунку 3 і зупиняє хибнопозитивне. дякую Джонатану Аллану за написання цього прекрасного пояснення


Це стверджує, що 8 є напівприміром
xnor

n**(1/3)%1>0<sum...повинні працювати.
Денніс

1
@xnor виправив це.
Прут

Зробив крихітну правку (наприклад, у 6 кубиків є багато більше дільниць)
Джонатан Аллан

6

Ruby , 56 48 байт

->x{r=c=2;0while x%r<1?(x/=r;c-=1):x>=r+=1;c==0}

Спробуйте в Інтернеті!

Як це працює:

->x{                    # Lambda function
    r=c=2;              # Starting from r=2, c=2
    0 while             # Repeat (0 counts as a nop)
        x%r<1? (        # If x mod r == 0
            x/=r:       # Divide x by r
            c-=1        # decrease c
        ):              # else
            x>=r+=1     # increase r, terminate if r>x 
    );
    c==0                # True if we found 2 factors
}

Дякуємо Value Ink за ідею, яка зберегла 8 байт.


Чому б просто не cпочати з 0 і рахувати, а не робити масив, до якого ви додаєте всі фактори? Таким чином ви вирішите скористатися потребою sizeв кінці
Value Ink

Ви маєте рацію, це тому, що я написав функцію факторизації для іншого виклику, і я її повторно використав тут.
ГБ


4

Нейм , 4 байти

𝐏𝐥δ𝔼

Спробуйте в Інтернеті!


Чи можете ви пояснити, як це в 4 байти? ... Я абсолютно розгублений.
Містер Xcoder

Lol У мене щойно це було
HyperNeutrino


@ Mr.Xcoder Використовуючи кодову Neim, це 𝐏, 𝐥, δі в 𝔼вигляді окремих байтів.
HyperNeutrino

@HyperNeutrino я просто заплутав 2-х трохи, і тепер це єдина відповідь без 2 :)
Okx

4

Python 2 , 67 байт

lambda k:f(k)==2
f=lambda n,k=2:n/k and(f(n,k+1),1+f(n/k,k))[n%k<1]

Спробуйте в Інтернеті!

-10 байт завдяки @JonathanAllan!

Кредит за алгоритм основної факторизації йде Деннісу (у початковій версії)


Ви використовували код з відповіді Денніса ? Якщо так, то вам слід надати кредит.
цілкомлюдсько

1
@totallyhuman О так, вибачте. Я використав це сьогодні у двох різних відповідях, і я дав йому кредит в одній з них, але я забув це зробити ще раз. Дякуємо, що помітили це!
Містер Xcoder


@JonathanAllan Вау, спасибі велике!
Містер Xcoder



4

Mathematica 32 байти

Завдяки нугенезу збережено 1 байт

Tr@FactorInteger[#][[;;,2]]==2&

1
Збережіть один байт, використовуючи ;;замість All.
ngenisis






3

Гая , 4 байти

ḍl2=

4 байти здається загальною довжиною, мені цікаво, чому ...: P

Спробуйте в Інтернеті!

Пояснення

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4 байти, здається, є загальною довжиною, мені цікаво, чому ... - Можливо, тому, що всі відповіді є простими факторами, довжина дорівнює 2?
Містер Xcoder

@MrXcoder Так, саме
Business Cat

4 з яких шахта BTW> _>
Містер Xcoder

4 також є першим напівпервідом. Моторошний!
Ніл




2

Java 8, 69 61 байт

n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}

-8 байт завдяки @Nevay .

Спробуйте тут.


1
Ви можете видалити оператор else (який може бути else++r;), щоб зберегти 8 байт n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Невай


1

C #, 112 байт

n=>{var r=Enumerable.Range(2,n);var l=r.Where(i=>r.All(x=>r.All(y=>y*x!=i)));return l.Any(x=>l.Any(y=>y*x==n));}

З застосованим форматуванням:

n =>
{
    var r = Enumerable.Range (2, n);
    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
    return l.Any (x => l.Any (y => y * x == n));
}

І як тестова програма:

using System;
using System.Linq;


namespace S
{
    class P
    {
        static void Main ()
        {
            var f = new Func<int, bool> (
                n =>
                {
                    var r = Enumerable.Range (2, n);
                    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
                    return l.Any (x => l.Any (y => y * x == n));
                }
            );

            for (var i = 0; i < 100; i++)
                Console.WriteLine ($"{i} -> {f (i)}");
            Console.ReadLine ();
        }
    }
}

Який має вихід:

0 -> False
1 -> False
2 -> False
3 -> False
4 -> True
5 -> False
6 -> True
7 -> False
8 -> False
9 -> True
10 -> True
11 -> False
12 -> False
13 -> False
14 -> True
15 -> True
16 -> False
17 -> False
18 -> False
19 -> False
20 -> False
21 -> True
22 -> True
23 -> False
24 -> False
25 -> True
26 -> True
27 -> False
28 -> False
29 -> False
30 -> False
31 -> False
32 -> False
33 -> True
34 -> True
35 -> True
36 -> False
37 -> False
38 -> True
39 -> True
40 -> False
41 -> False
42 -> False
43 -> False
44 -> False
45 -> False
46 -> True
47 -> False
48 -> False
49 -> True
50 -> False
51 -> True
52 -> False
53 -> False
54 -> False
55 -> True
56 -> False
57 -> True
58 -> True
59 -> False
60 -> False
61 -> False
62 -> True
63 -> False
64 -> False
65 -> True
66 -> False
67 -> False
68 -> False
69 -> True
70 -> False
71 -> False
72 -> False
73 -> False
74 -> True
75 -> False
76 -> False
77 -> True
78 -> False
79 -> False
80 -> False
81 -> False
82 -> True
83 -> False
84 -> False
85 -> True
86 -> True
87 -> True
88 -> False
89 -> False
90 -> False
91 -> True
92 -> False
93 -> True
94 -> True
95 -> True
96 -> False
97 -> False
98 -> False
99 -> False


1

Сітківка , 45 байт

.+
$*
^(11+)(\1)+$
$1;1$#2$*
A`\b(11+)\1+\b
;

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

.+
$*

Перетворити в одинарне.

^(11+)(\1)+$
$1;1$#2$*

Спробуйте знайти два фактори.

A`\b(11+)\1+\b

Переконайтеся, що обидва фактори є першочерговими.

;

Переконайтесь, що було виявлено два фактори.


1

Python 2, 90 байт

def g(x,i=2):
 while x%i:i+=1
 return i
def f(n,l=0):
 while 1%n:l+=1;n/=g(n)
 return l==2

fприймає ціле число, що nперевищує або дорівнює 1, повертає булеве значення.

Спробуйте в Інтернеті!

Тестові приклади:

>>> f(1)
False
>>> f(2)
False
>>> f(3)
False
>>> f(4)
True
>>> f(6)
True
>>> f(8)
False
>>> f(30)
False
>>> f(49)
True
>>> f(95)
True

1

J , 6 байт

5 байт буде працювати одноразово:

   2=#q: 8
0
   2=#q: 9
1

Я вважаю, що мені потрібно шість, коли я визначаю функцію:

   semiprime =. 2=#@q:
   (,. semiprime) 1 + i. 20
 1 0
 2 0
 3 0
 4 1
 5 0
 6 1
 7 0
 8 0
 9 1
10 1
11 0
12 0
13 0
14 1
15 1
16 0
17 0
18 0
19 0
20 0



0

Perl 6 , 43 байти

{my \f=first $_%%*,2..$_;?f&&is-prime $_/f}

Спробуйте в Інтернеті!

f- найменший коефіцієнт, більший за 1 вхідного аргументу $_, або Nilякщо $_дорівнює 1. Повернене значення функції є істинним, якщо fє істинним (тобто, ні Nil) І вхідний аргумент, розділений на коефіцієнт, є простим.

Якщо $_сама по собі проста, тоді fбуде дорівнює $_і $_ / fдорівнює 1, що не є простим, тому формула працює і в тому випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.