세미 프라임의 인자를 나타내는 가장 작은 승수


16

주어진 semiprime N은 , 작은 양의 정수 찾을 m을 두 요인의 하나의 이진 표현되도록 N은 이진 표현에서 찾을 수 N * m .

semiprime N = 9799를 고려해 봅시다 .

1부터 시작하여 다른 m 값을 시도합니다 .

 m |  N * m |   N * m in binary
---+--------+------------------
 1 |   9799 |    10011001000111
 2 |  19598 |   100110010001110
 3 |  29397 |   111001011010101
 4 |  39196 |  1001100100011100
 5 |  48995 |  1011111101100011
 6 |  58794 |  1110010110101010
 7 |  68593 | 10000101111110001
 8 |  78392 | 10011001000111000
 9 |  88191 | 10101100001111111
10 |  97990 | 10111111011000110
11 | 107789 | 11010010100001101

마지막 제품 101001의 이진 표현에는 41 의 이진 표현 인 9799 의 두 가지 요소 중 하나 (다른 하나는 239 ) 가 포함되어 있기 때문에 여기서 멈 춥니 다 .

예

답은 11 입니다.

규칙 및 메모

  • m의 값을 시도하는 것은 의미가 없습니다. 그것들은 완전성을 위해 위의 예에서 보여졌습니다.
  • 프로그램은 N * m 이 사용자 언어의 컴퓨팅 기능 내에 있는 N 을 지원해야합니다 .
  • 당신은 인수 분해 할 수 있습니다 N을 의 이진 표현의 각각의 가능한 문자열 것보다 사전에 오히려 N * m을 그것의 인자로 밝혀 있는지 확인하기 위해 N .
  • MitchellSpector의해 입증 된 바와 같이 , m은 항상 존재합니다.
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다. 표준 허점은 금지되어 있습니다.

테스트 사례

첫 번째 열은 입력입니다. 두 번째 열은 예상 출력입니다.

         N |    m |         N * m |                              N * m in binary | Factor
-----------+------+---------------+----------------------------------------------+-------
         9 |    3 |            27 |                                      [11]011 |      3
        15 |    1 |            15 |                                       [11]11 |      3
        49 |    5 |           245 |                                   [111]10101 |      7
        91 |    1 |            91 |                                    10[1101]1 |     13
       961 |   17 |         16337 |                             [11111]111010001 |     31
      1829 |    5 |          9145 |                             1000[111011]1001 |     59
      9799 |   11 |        107789 |                          1[101001]0100001101 |     41
     19951 |   41 |        817991 |                       1[1000111]101101000111 |     71
    120797 |   27 |       3261519 |                     11000[1110001]0001001111 |    113
   1720861 |  121 |     208224181 |               11000110100[100111111101]10101 |   2557
 444309323 |  743 |  330121826989 |    100110011011100110010[1101010010101011]01 |  54443
 840000701 | 4515 | 3792603165015 | 11011100110000[1000110000111011]000101010111 |  35899
1468255967 |   55 |   80754078185 |      1001011001101010100010[1110001111]01001 |    911

흠, 나는 우리가 당신의 블랙 잭 시퀀스 챌린지에서 사용했던 것과 비슷한 알고리즘 냄새가납니다 ...
ETHproductions

@ETHproductions 흠, 정말로? 그들은 솔직히 완전히 관련이 없어야합니다.
Arnauld

글쎄, 그것들은 주로 특정 속성에 대한 모든 인접한 부분 문자열을 확인해야한다는 점에서 비슷합니다. 그 외에는 실제로는 관련이 없습니다.
ETHproductions

"아마도 격려"-미안합니다. 우리는 코드 속도에 신경 쓰지 않습니다.
존 드보락

@JanDvorak 박람회. 제거되었습니다.
Arnauld

답변:


6

Pyth, 13 바이트

ff}.BY.B*TQPQ

데모

설명:

ff}.BY.B*TQPQ
f                Find the first integer >= to 1 where the following is true
 f         PQ    Filter the prime factors of the input
        *TQ      Multiply the input by the outer integer
      .B         Convert to a binary string
   .BY           Convert the prime factor to a binary string
  }              Check whether the factor string is in the multiple string.

6

05AB1E , 18 16 15 바이트

라일리 덕분에 -2 바이트!

Emigna 덕분에 -1 바이트!

[N¹*b¹Ñ¦¨båOiNq

설명:

[                   # Infinite loop start
 N                  # Push the amount of times we have iterated
  ¹*               # Multiplied by input
    b              # Convert to binary
     ¹Ñ¦¨b         # Calculate the proper divisors of the input in binary excluding one
          åO       # Check if a substring of N * m in binary is in the divisors
            iNq    # If so, print how many times we have iterated and terminate the program

온라인으로 사용해보십시오!


¹Ñ¦¨båO각 하위 문자열을 확인하는 대신 작동해야합니다.
라일리

@Riley 그것을 발견해 주셔서 감사합니다!
Okx

2
당신은 다른 바이트가 교체 저장할 수 ¼¾함께 N.
Emigna 2012

@Emigna 나는 그 트릭에 대해 몰랐습니다, 감사합니다!
Okx

4

자바 스크립트 (ES6), 96 95 80 바이트

n=>F=m=>(k=p=>p&&(q=1,g=x=>1<x&&x<n&n%x<1|g(x>>1,q*=2))(p)|k(p-q))(n*m)?m:F(-~m)

재귀 함수를 사용하는 재귀 함수를 사용하는 재귀 함수를 반환하는 함수입니다. .toString(2)노선이 더 짧은 지 궁금해지기 시작했습니다 ...

예를 들어 변수에 할당 f=n=>...하고 여분의 parens 쌍으로 호출하십시오 f(9)(). 이것이 허용되지 않으면 ( 메타 게시물 이 +6/2), 표준 호출에서이 83 바이트 버전을 사용할 수 있습니다.

f=(n,m)=>(k=p=>p&&(q=1,g=x=>1<x&&x<n&n%x<1|g(x>>1,q*=2))(p)|k(p-q))(n*m)?m:f(n,-~m)

두 버전 모두 마지막 세 가지 테스트 사례를 제외하고 모두 작동합니다. 로 변경 x>>1하여 이러한 테스트 사례를 시도 할 수도 있습니다 (x-x%2)/2.


확실하지 그것에 대해 합의가 (우리가 있습니다 정말이 있다면 + 6 / -2 내가 걱정 멀리로하지만, 첫 번째 입력 형식은 미세 게시시).
Arnauld 2012

3

Bash + Unix 유틸리티, 85 84 바이트

for((;;m++)){ dc -e2o$[$1*m]n|egrep -q $(dc "-e2o`factor $1`nBEPn")&&break;}
echo $m

온라인으로 사용해보십시오!


나는 또한 모든 세미 프라임 n에 대해 m이 항상 존재한다는 것을 지적 할 것입니다. 이유는 다음과 같습니다.

n = pq를 쓰십시오. 여기서 p와 q는 소수이고 p <= q입니다.

n-1의 이진 표현에서 자릿수를 b로하자. 그런 다음 0과 n-1 사이의 모든 k에 대해 이진의 p * (2 ^ b) + k는 p의 이진 표현과 k를 나타내는 b의 추가 비트로 구성됩니다.

따라서 이진수로 쓰여질 때 0 <= k <= n-1에 대한 숫자 p * (2 ^ b) + k는 p의 이진 표현으로 시작합니다. 그러나 이들은 n 개의 연속 된 숫자이므로 그 중 하나는 n의 배수 여야합니다.

이진 표현이 p의 이진 표현으로 시작하는 n의 배수는 n이됩니다.

이를 바탕으로 m의 sqr (n)에 대한 상한을 얻을 수 있습니다. (아마도 이것보다 훨씬 더 엄격한 상한을 얻을 수 있습니다.)


2

하스켈, 161 바이트

import Data.List
(!)=mod
a#b|a!b==0=b|0<1=a#(b+1)
g 0=[]
g n=g(n`div`2)++show(n!2)
(a%b)c|g b`isInfixOf`g(a*c)=c|0<1=a%b$c+1
f n=min(n%(n#2)$1)$n%(n`div`(n#2))$1

간단한 점검. 먼저 요인을 계산 한 다음 1부터 시작하여 선형으로 검색하고 두 요인에 대한 최소값을 취합니다.

마지막 테스트 케이스 ( 1468255967)에 몇 초가 걸리며 랩톱에 ghci보고 (15.34 secs, 18,610,214,160 bytes)됩니다.


2

수학, 83 바이트

1//.x_/;FreeQ[Fold[#+##&]/@Subsequences@IntegerDigits[x#,2],d_/;1<d<#&&d∣#]:>x+1&

2

Brachylog (2), 14 바이트

ḋḃᵐD∧?:.×ḃs∈D∧

온라인으로 사용해보십시오!

Brachylog에서 14 바이트로 이것을 쓰는 방법은 여러 가지가 있으므로 가장 효율적으로 갔다. Brachylog 제출에 공통적 인 것처럼 이것은 기능 제출입니다. 입력은 준 프라임이고 출력은 승수입니다.

설명

ḋḃᵐD∧?:.×ḃs∈D∧
ḋ               Prime decomposition (finds the two prime factors)
 ḃᵐ             Convert each factor to binary
   D            Name this value as D
    ∧?          Restart with the user input
      :.×       The output is something that can be multiplied by it
         ḃ      to produce a number which, when expressed in binary
          s     has a substring
           ∈D   that is an element of D
             ∧  (suppress an implicit constraint that D is the output; it isn't)

Prolog와 Brachylog의 평가 순서는 입력에서 즉시 추론 할 수없는 첫 번째 제약 조건에 의해 설정됩니다. 이 프로그램에서는 곱셈 결과에 대한 제약 조건이므로 인터프리터는 곱셈의 피연산자를 가능한 한 0에 가깝게 유지하는 것을 목표로합니다. 우리는 피연산자 중 하나를 알고 있고, 다른 하나는 출력이므로, 우리가 할 수있는 가장 작은 출력을 찾으십시오. 정확히 원하는 것입니다.


1

PowerShell , 136 바이트

param($n)$a=2..($n-1)|?{!($n%$_)}|%{[convert]::ToString($_,2)};for(){$b=[convert]::toString(++$m*$n,2);if($a|?{$b-like"*$_*"}){$m;exit}}

온라인으로 사용해보십시오!

PowerShell에서 이진으로의 변환이 작동하는 방식으로 인해 매우 오래 걸립니다. :-/

입력 을 받고 $n, 반복 하여 요소를 끌어냅니다 . 루프로들을 전송 하고 이진 (베이스에 각각 S는 ) 스트링. 이진 문자열을에 저장합니다 .2$n-1!($n%$_)|%{...}convert2$a

그런 다음 무한 for(){...}루프에 들어갑니다 . 반복 할 때마다, 우리는 증가 ++$m, 곱셈에 의한 $n, 그리고 convert바이너리 문자열로 저장하는 것이로 $b. 그런 다음, if해당 문자열은 정규식 -like에서 모든 문자열 $a우리 출력 $mexit.


0

펄 6 , 66 바이트

->\n{first {(n*$_).base(2)~~/@(grep(n%%*,2..^n)».base(2))/},^∞}

정규식 기반.

시도하는 모든 숫자의 모든 정규식 일치 위치에서 n 의 요소를 다시 무차별 적으로 강제하기 때문에 매우 느립니다 .

요인을 한 번만 계산하면 성능이 향상되지만 72 바이트가됩니다.

->\n{my @f=grep(n%%*,2..^n)».base(2);first {(n*$_).base(2)~~/@f/},^∞}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.