Category Archives: Programming

Một bài lập trình hay về số nguyên tố

Số nguyên tố là thứ quá đỗi quen thuộc với những ai học toán, cũng như đối với các lập trình viên. Ai học giải thuật đều đã giải qua những bài về số nguyên tố, với độ khó dàn trải từ đơn giản tới phức tạp, từ vòng lặp thử tính chia hết tới sàng số nguyên tố Eratosthene…

Hôm nay mình rảnh thì có nghĩ ra một bài như thế này, các bạn xem qua nhé!

Đề bài: Cho hai số nguyên dương x và y (các test case đưa vào luôn đảm bảo x > y). Viết chương trình kiểm tra xem x2 – y2 có phải là số nguyên tố hay không.

Thoạt nhìn qua thì bài này khá đơn giản. Tính x2 – y2, rồi kiểm tra. Nhưng khi x và y lớn, ví dụ cỡ 1018 thì cách này sẽ chạy quá thời gian.

Hãy quan sát biểu thức x2 – y2. Nếu bạn đã học 7 hằng đẳng thức đáng nhớ, sẽ dễ thấy rằng x2 – y2 có thể được viết dưới dạng (x-y)(x+y). Vì x và y đều là các số nguyên dương, nên x 1 và y 1. Từ đó suy ra: (x+y) 1.

Xét biểu thức còn lại, x-y. Sẽ xảy ra hai trường hợp là (x-y) 1 và (x-y)=1. Với trường hợp đầu tiên, x2 – y2 sẽ không là số nguyên tố vì vi phạm định nghĩa (chỉ có hai ước là 1 và chính nó). Do đó với (x-y)=1, biểu thức ban đầu sẽ tương đương với chỉ x+y. Ta chỉ cần xét x+y là đủ. Sau đây là code miêu tả bài toán này.

bool primeSquare(long long a, long long b)
    if (a-b != 1) return false;
    long long num = a + b;
    if (num % 2 == 0) return false;
    for (long long i = 3; i*i <= num; i += 2)
        if (num % i == 0) return false;
    return true;

Best way to install Node.js and NPM

I’m writing this post as I need to install node.js and npm to install packages for reveal.js, I’m on Ubuntu 18.04 Bionic.

Normally we can install node.js via terminal by

sudo apt install nodejs

But this is not the best way since the version is outdated and some dependencies won’t meet. The best way to install the latest node.js and npm is via nvm.

curl -o- | bash

Note that the version number can be checked by going directly to the website and see. The above script will download all the package and put nvm into the Linux alias (so we can use the nvm command globally). After this, log out and log in to activate the alias.

Once you log in, run below script

nvm install node

To update:

nvm install node
nvm alias default nodenvm install node
nvm alias default node

From this answer:

Use conda package in Sublime Text to switch between Python Environment

More and more people are using Anaconda for their Python needs. One important thing to notice is that Python has two version 2.7 (supported till 2020) and 3.6. Some packages are still using Python 2.7, also, when you install a suite of program for certain purpose (data analysis, image processing…), creating one environment for each purpose is a wise move.

Sublime Text (ST) is a very fast and intuitive text editor, it supports Win/Linux/Mac. We can download and use it for free (with some notification about purchasing), or we can buy a license ($80) at the time I write this blog post.

Running a Python script in ST is simple. You edit the script, choose the build system as Python, then Ctrl + B or choose Build to run the script. However, this would work only when you define Python Path for the system. How about those environment you created in Anaconda? You can do that easily by the package in ST, named CONDA.

To install CONDA, you need Package Manager inside ST. The complete guide can be found here. Then in ST, you should choose the Build System as Conda instead of Python. Now every time to want to activate the right environment, in ST just press Ctrl + Shift + P (to open the Package Option Panel) then type in CONDA, all the possible options are there.

Sort by moving elements to start or end with fewest moves

Getting started

You may be familiar with quick-sort, but when you stumble across this problem, it turns out to be a lot more complex. Since you need to determine the method that involves the fewest moves possible, you will have to take another approach. The given problem can be re-stated into this problem:

Problem statement

Hien is the class monitor and he wants his classmates to form a line, in which the height of every students is in ascending order. He needs to form that line by moving his classmates from the line to the start or end of it and it has to be a quick process, since Hien is very lazy and needs to play Age Of Empires right away. Write an algorithm to help him.

Input format

First line: n.

Second line: numbers indicating the height of every student in the class, each seperated by a space.


n ≤ 100; H[i] ≤ 100000 (H[i] is the height of an individual).

Output format

An integer indicating the fewest moves possible.

Sample input


2 1 3 5

Sample output



The student with height 1 is moved to the start of the line.

Let’s not pay attention to the ‘fewest moves’ for a while. Normally, when you see these types of ‘moving’ elements to start or end of an array, you can take a look at a basic approach.

Let’s take the Sample input as an example. With the basic approach, we search for the smallest element in the array, which is now 1. After that, we move it to the far right of the array. Then, we search for the next smallest element, which is 2, and we keep doing it until 5 is moved to the far right of the array. We come to the conclusion that for this approach, the number of moves that are taken is exactly equal to the number of elements present in the array itself. But let’s have a closer look. We can see that 2, 3 and 5 are contiguous, meaning that the relative order between them is not changed at all when sorting is completed. So, we can know that in the required algorithm, we need to conserve the order of contiguous integers. That is when std::pair comes to use.

Basic approach illustration

What is std::pair, exactly?

Std::pair is a pre-defined class in C++. A pair element is consisted of 2 other sub-elements, which can be classified as first and second. In the algorithm we are searching for, as stated earlier, we can utilise std::pair to get the job done by assigning the input elements to first and its index to second.

Get the job done

After that, quick-sort comes in handy. We then use it to sort the array in ascending order. Because std::pair is used, when sorting the elements, each index is carried along with the data. Then, we can just compare the indexes of every subsequent element. Job done!

Final approach illustration

Source code (C++)

Justify text automatically in wordpress blogpost

The new Gutenberg editor provided by WordPress is pretty neat. However, there are certain limits of the ability to align text as what we usually do in Microsoft Word, especially the nice-looking “justified text”.

In earlier version of the editor, we can open the extended editing bar and there would be a Justified Alignment option to click and apply on the paragraph. The current one doesn’t have it. To resolve this problem, there are several options: install the old editor plugin (which will be supported till 2022), or simply put the CSS code in the Additonal CSS section of the current theme setting:

p {text-align:justify}

Then all the paragraphs from now on will be formatted as Justified.

Từ LaTeX sang Word/PPT/Illustrator…

LaTeX là ngôn ngữ soạn thảo được nhiều người, đặc biệt là dân có ‘động chạm’ đến toán, thích và sử dụng. LaTeX mạnh hơn Word ở chỗ công thức toán có thể cho vào văn bản một cách đơn giản và đẹp (đẹp hơn Equation và MathType nhiều!) và làm việc ở môi trường nào cũng được: windows, linux, OSX….

Đó là để giới thiệu cho những người chưa biết Latex là gì, còn khi ai đó đã tìm đến câu hỏi ở đề bài thì dưới đây sẽ đi thẳng vào vấn đề luôn.

Continue reading Từ LaTeX sang Word/PPT/Illustrator…

The Best Programming Languages

Five of the Best Programming Languages and Frameworks for a Small Business

Choosing a programming framework for a small business can be overwhelming- there are so many. Here are a few of the best choices, to help you get started.

Ask a room of ten developers which programming framework is the ‘best on the market,’ and you’re liable to receive ten different answers. Each developer will sing the praises of a different language, and each one will very probably feel that theirs is the only logical choice. The most confusing thing, though? Each and every one of those developers will be correct.

Continue reading The Best Programming Languages

Available Python tools for researchers

When I first start my research life, I began with Python, and I never go back. Python is powerful, simple, rich and widely supported.

In my researches, I met several problems, and I built the solution, but a lot of them are already prepared in Python.

  1. Plotting – matplotlib:
    I often use Matlab to plot my diagrams, but matplotlib is so powerful and produces nice plots. There are lots of examples that you will be able to master this package in no time. Continue reading Available Python tools for researchers

Handle Error in Python with try except

for i in range(20):
    something here
  except IOError:

 When python finds error in the code, it will stop and escape the loop and it might be a nightmare for us, so making an exception handler is a smart choice.

The above code is the simplest usage of try… except function, it means that, from the range(20) we will do ‘something here’, but if there are errors, here for example the error IOError is the error of not finding the object, thanks to try except, python in this case will process the ‘pass’ (forget the error and continue). So the loop is safe and can be continued.