숫자가 3의 배수 인 경우 알고리즘 계산


13

정신 미적분을 할 때 할 수있는 일 :

  • 정수 k가 주어지면 모든 자릿수 (10의 밑수)를 합산하고 결과가 3의 배수이면 k는 3의 배수입니다.

알고리즘은 비슷하게 작동하지만 이진수 숫자 (비트)로 작동하는 알고리즘을 알고 있습니까?

  • 처음에, 나는 기초 2에서 기초 10으로의 변환을 수행하기 위해 정수를 아스키로 변환하는 언어의 기성품 함수를 사용하고 정신 미적분법을 적용하려고 생각했습니다. 그러나 물론 기본 변환 2를 10으로 직접 인코딩 할 수도 있습니다. 아직하지는 않았지만 시도해 보도록하겠습니다.

  • 그런 다음베이스 2의 유클리드 디비전을 생각했습니다 ...

그러나 다른 수단, 알고리즘이 있는지 궁금합니다.


답변:


22

다음 두 가지 관찰을 고려하십시오 (독자의 연습으로 남음).

  1. 2의 짝수는 1 모듈로 3입니다.
  2. 2의 승수는 -1 모듈로 3입니다.

우리는 짝수 위치의 비트의 합이 홀수 위치 모듈로 3의 비트의 합과 같은 경우에만 (2 진) 숫자를 3으로 나눌 수 있다고 결론 내립니다.


7
이것은 십진수로 11로 나눌 수있는 규칙과 같습니다.
Yuval Filmus

1
@ YuvalFilmus : 정확하게. 나는 독자를 위해 또 다른 운동을 추가하려고했지만 반대하기로 결정했다.
mhum

3
16 진수로 쓰여진 숫자를 17 (10 진수)로 나눌 수 있는지 알아내는 것은 어떻습니까? 아니면 그 문제에 대해 15 (십진수)? ;-)
vonbrand

33

작업에 대한 유한 상태 자동 장치는 어떻습니까?

여기에 이미지 설명을 입력하십시오

axval(x)x2val(x)+axapa2p+amod3p{0,1,2}a{0,1}x{0,1}문자열이다 wheras 이진 문자열 값이다.val(x)N


1
나는이 아이디어를 좋아한다. 9로 해보자. 나는 1001을 이진수로 먹인다. 첫 번째 비트는 state1, 나를 state2, state1, state0으로 다시 보냅니다. state0은 3의 배수입니다. 그리고 알고리즘의 복잡성은 사용 된 비트 수입니다. 그것은 굉장 !
Stephane Rolland

링크에서이 개념이 관련되어 있습니까? 더 간단하다고 생각합니다. geomathry.wordpress.com/2017/02/13/0-1-and-a-new-number

1
@WaqarAhmad 예, 더 간단하지는 않습니다. 유한 오토 마톤의 전환은 설명과 같이 L2R 평가를 설명하는 데 사용될 수도 있습니다. 전이는 , , , , , 합니다. 여기에는 세 개의 상태가 있으므로 상태에 대한 세 개의 기호가 필요합니다. 기호 은 각각 모듈로 에 대한 평가이며 L2R 평가의 첫 번째 기호는 "상태"입니다. 토론을 원한다면 사이트에서 새로운 질문을 시작하는 것이 좋습니다! 0¯0=0¯0¯1=1¯1¯0=2¯1¯1=0¯2¯0=1¯2¯1=2¯Θ,1,01,2,0
헨드릭 얀

프로그래밍을하지 마십시오. 이 일이 삼진 컴퓨터에서 더 효율적일까요?

4

이진수로 숫자 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) 등은 모두 11 (3)로 나눈 후 동일한 잔차를 제공합니다. 따라서 이진수를 짝수 길이 의 부분으로 나누면 부분의 합이 원래 숫자와 동일한 나머지를 제공합니다.

(숫자를 나눌 때 시작 부분에 필요한만큼 0을 추가합니다 . 예를 들어 10111을 그룹 01,01,11 또는 0001,0111로 나눕니다.)

수학적으로 숫자를 자리 그룹으로 나눈 다음 그룹을 추가하십시오. 결과가 00 또는 11이 될 때까지 이것을 반복하십시오. = 원래 숫자는 3의 배수입니다. 또는 01 또는 10 = 원래 숫자가 3의 배수 가 아니 었 습니다.

컴퓨터 프로그램의 경우 8 비트 또는 16 비트 또는 32 비트 비트 그룹을 사용하면 CPU 속도더 빠를 수 있습니다 . 예를 들어, 8 비트 더하기가 가장 빠른 경우 결과가 1 바이트가 될 때까지 모든 바이트의 합계를 계산하십시오. 그런 다음 하나의 명령어를 사용하여 나머지를 3으로 나눈 후 나머지를 결정하십시오.

(참고 : 여기서 부호없는 정수를 가정하고 있습니다. 부호있는 숫자의 경우 좀 더주의를 기울여야합니다. 예를 들어 129는 3의 배수이지만 -127은 아닙니다. 비트 10000001은 전자를 부호없는 바이트로 의미하지만 후자는 부호있는 바이트로 나타냅니다.)


0

이진법에 한정되지는 않지만, 의심스러운 경우 반복되는 빼기는 항상 나머지로 나누기를 계산하는 확실한 방법입니다 (따라서 숫자가 3의 배수 인 경우).


2
뺄셈을 반복하는 것은 나쁜 생각입니다. 나머지 부분이 훨씬 빠릅니다.
Yuval Filmus

3
아마도 실제로 CPU에서 실제로 비용이 많이 들지만, 다른 알고리즘입니다 :-) -1 :
Stephane Rolland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.